opal 0.3.6 → 0.3.9
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.
- data/README.md +69 -97
- data/bin/opal +2 -2
- data/{lib/core → corelib}/array.rb +85 -56
- data/corelib/boolean.rb +20 -0
- data/corelib/class.rb +58 -0
- data/{lib → corelib}/core.rb +2 -50
- data/corelib/dir.rb +22 -0
- data/{lib/core → corelib}/enumerable.rb +0 -0
- data/corelib/error.rb +19 -0
- data/{lib/core → corelib}/file.rb +7 -9
- data/{lib/core → corelib}/hash.rb +104 -144
- data/{lib/core → corelib}/kernel.rb +38 -44
- data/corelib/load_order +21 -0
- data/{lib/core → corelib}/match_data.rb +0 -0
- data/{lib/core → corelib}/module.rb +12 -8
- data/{lib/core → corelib}/nil_class.rb +2 -2
- data/{lib/core → corelib}/numeric.rb +37 -100
- data/corelib/object.rb +37 -0
- data/{lib/core → corelib}/proc.rb +3 -3
- data/corelib/range.rb +27 -0
- data/{lib/core → corelib}/regexp.rb +1 -1
- data/{lib/core → corelib}/string.rb +16 -107
- data/{lib/core → corelib}/top_self.rb +0 -0
- data/lib/opal.rb +7 -0
- data/lib/opal/browserify.rb +34 -0
- data/{opal_lib → lib}/opal/builder.rb +70 -24
- data/lib/opal/command.rb +52 -0
- data/lib/opal/context.rb +197 -0
- data/{opal_lib/opal/ruby/parser.rb → lib/opal/lexer.rb} +20 -4
- data/{opal_lib/opal/ruby → lib/opal}/nodes.rb +238 -127
- data/lib/opal/parser.rb +4894 -0
- data/{opal_lib/opal/ruby/ruby_parser.y → lib/opal/parser.y} +38 -18
- data/lib/rbp.rb +2 -0
- data/lib/rbp/package.rb +49 -0
- data/runtime/class.js +216 -189
- data/runtime/fs.js +2 -2
- data/runtime/init.js +242 -244
- data/runtime/loader.js +78 -99
- data/runtime/module.js +34 -40
- data/runtime/post.js +2 -2
- data/runtime/pre.js +1 -1
- data/runtime/runtime.js +129 -135
- data/{lib → stdlib}/dev.rb +10 -10
- data/{lib → stdlib}/racc/parser.rb +0 -6
- data/{lib → stdlib}/strscan.rb +4 -4
- metadata +57 -105
- data/lib/core/basic_object.rb +0 -51
- data/lib/core/class.rb +0 -38
- data/lib/core/dir.rb +0 -26
- data/lib/core/error.rb +0 -75
- data/lib/core/false_class.rb +0 -81
- data/lib/core/object.rb +0 -6
- data/lib/core/range.rb +0 -27
- data/lib/core/symbol.rb +0 -42
- data/lib/core/true_class.rb +0 -41
- data/lib/ospec.rb +0 -7
- data/lib/ospec/autorun.rb +0 -8
- data/lib/ospec/dsl.rb +0 -15
- data/lib/ospec/example.rb +0 -11
- data/lib/ospec/example/before_and_after_hooks.rb +0 -56
- data/lib/ospec/example/errors.rb +0 -17
- data/lib/ospec/example/example_group.rb +0 -12
- data/lib/ospec/example/example_group_factory.rb +0 -18
- data/lib/ospec/example/example_group_hierarchy.rb +0 -21
- data/lib/ospec/example/example_group_methods.rb +0 -100
- data/lib/ospec/example/example_group_proxy.rb +0 -15
- data/lib/ospec/example/example_methods.rb +0 -46
- data/lib/ospec/example/example_proxy.rb +0 -18
- data/lib/ospec/expectations.rb +0 -19
- data/lib/ospec/expectations/errors.rb +0 -8
- data/lib/ospec/expectations/fail_with.rb +0 -9
- data/lib/ospec/expectations/handler.rb +0 -33
- data/lib/ospec/helpers/scratch.rb +0 -18
- data/lib/ospec/matchers.rb +0 -24
- data/lib/ospec/matchers/be.rb +0 -1
- data/lib/ospec/matchers/generated_descriptions.rb +0 -20
- data/lib/ospec/matchers/operator_matcher.rb +0 -54
- data/lib/ospec/matchers/raise_error.rb +0 -38
- data/lib/ospec/runner.rb +0 -90
- data/lib/ospec/runner/example_group_runner.rb +0 -41
- data/lib/ospec/runner/formatter/html_formatter.rb +0 -139
- data/lib/ospec/runner/formatter/terminal_formatter.rb +0 -48
- data/lib/ospec/runner/options.rb +0 -34
- data/lib/ospec/runner/reporter.rb +0 -82
- data/opal_lib/opal.rb +0 -16
- data/opal_lib/opal/build_methods.rb +0 -51
- data/opal_lib/opal/bundle.rb +0 -70
- data/opal_lib/opal/command.rb +0 -68
- data/opal_lib/opal/context.rb +0 -81
- data/opal_lib/opal/context/console.rb +0 -10
- data/opal_lib/opal/context/file_system.rb +0 -34
- data/opal_lib/opal/context/loader.rb +0 -135
- data/opal_lib/opal/gem.rb +0 -84
- data/opal_lib/opal/rake/builder_task.rb +0 -44
- data/opal_lib/opal/rake/spec_task.rb +0 -32
- data/opal_lib/opal/ruby/ruby_parser.rb +0 -4862
- data/opal_lib/opal/version.rb +0 -4
- data/runtime/debug.js +0 -84
data/corelib/boolean.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class Boolean
|
|
2
|
+
|
|
3
|
+
def to_s
|
|
4
|
+
# Yeah, this is another one for the wtf? collection. As the receiver
|
|
5
|
+
# is a true or false literal, it is coerced into a Boolean object,
|
|
6
|
+
# therefore it is always truthy. Therefore we comapre ourself with
|
|
7
|
+
# true to see if we are actually true or false. We could instead do
|
|
8
|
+
# `return self.valueOf() ? "true" : "false", but this way seems a
|
|
9
|
+
# little faster..
|
|
10
|
+
`return self == true ? "true" : "false";`
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def ==(other)
|
|
14
|
+
`return self.valueOf() === other.valueOf();`
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
TRUE = true
|
|
19
|
+
FALSE = false
|
|
20
|
+
|
data/corelib/class.rb
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class Class < Module
|
|
2
|
+
|
|
3
|
+
def self.new(sup = Object)
|
|
4
|
+
`var res = rb_define_class_id('AnonClass', sup);
|
|
5
|
+
|
|
6
|
+
if (sup.m$inherited) {
|
|
7
|
+
sup.m$inherited(res);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return res;`
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def allocate
|
|
14
|
+
`return new self.$a();`
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def new(*args)
|
|
18
|
+
obj = allocate
|
|
19
|
+
|
|
20
|
+
`if ($B.f == arguments.callee) {
|
|
21
|
+
$B.f = obj.$m.initialize;
|
|
22
|
+
}`
|
|
23
|
+
|
|
24
|
+
obj.initialize *args
|
|
25
|
+
obj
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def inherited(cls)
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def superclass
|
|
33
|
+
`var sup = self.$s;
|
|
34
|
+
|
|
35
|
+
if (!sup) {
|
|
36
|
+
if (self == rb_cObject) return nil;
|
|
37
|
+
throw new Error('RuntimeError: uninitialized class');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return sup;`
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def native_prototype(proto)
|
|
44
|
+
`rb_native_prototype(self, proto);`
|
|
45
|
+
self
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Make the given object an instance of this class. This takes
|
|
49
|
+
# an **existing** object and adds the correct class, method
|
|
50
|
+
# table and id to the receiver.
|
|
51
|
+
#
|
|
52
|
+
# @param [NativeJSObject] obj
|
|
53
|
+
# @return [instance]
|
|
54
|
+
def from_native(obj)
|
|
55
|
+
`return rb_obj_from_native(obj, self);`
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
data/{lib → corelib}/core.rb
RENAMED
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
class Module
|
|
2
2
|
|
|
3
|
-
def private(*args)
|
|
4
|
-
`$rb.private_methods(self, args);`
|
|
5
|
-
self
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def public(*args)
|
|
9
|
-
`$rb.public_methods(self, args);`
|
|
10
|
-
self
|
|
11
|
-
end
|
|
12
|
-
|
|
13
3
|
def include(*mods)
|
|
14
4
|
`var i = mods.length - 1, mod;
|
|
15
5
|
while (i >= 0) {
|
|
@@ -22,7 +12,7 @@ class Module
|
|
|
22
12
|
end
|
|
23
13
|
|
|
24
14
|
def append_features(mod)
|
|
25
|
-
|
|
15
|
+
`rb_include_module(mod, self);`
|
|
26
16
|
self
|
|
27
17
|
end
|
|
28
18
|
|
|
@@ -32,7 +22,6 @@ class Module
|
|
|
32
22
|
end
|
|
33
23
|
|
|
34
24
|
module Kernel
|
|
35
|
-
private
|
|
36
25
|
|
|
37
26
|
# Try to load the library or file named `path`. An error is thrown if the
|
|
38
27
|
# path cannot be resolved.
|
|
@@ -40,8 +29,7 @@ module Kernel
|
|
|
40
29
|
# @param [String] path The path to load
|
|
41
30
|
# @return [true, false]
|
|
42
31
|
def require(path)
|
|
43
|
-
|
|
44
|
-
true
|
|
32
|
+
`return rb_require(path);`
|
|
45
33
|
end
|
|
46
34
|
|
|
47
35
|
# Prints the message to `STDOUT`.
|
|
@@ -70,45 +58,9 @@ class Object
|
|
|
70
58
|
include Kernel
|
|
71
59
|
end
|
|
72
60
|
|
|
73
|
-
class Symbol
|
|
74
|
-
def to_s
|
|
75
|
-
`return self.toString();`
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
61
|
class String
|
|
80
62
|
def to_s
|
|
81
63
|
`return self.toString();`
|
|
82
64
|
end
|
|
83
65
|
end
|
|
84
66
|
|
|
85
|
-
require 'core/basic_object'
|
|
86
|
-
require 'core/object'
|
|
87
|
-
require 'core/module'
|
|
88
|
-
require 'core/class'
|
|
89
|
-
require 'core/kernel'
|
|
90
|
-
require 'core/top_self'
|
|
91
|
-
require 'core/nil_class'
|
|
92
|
-
require 'core/true_class'
|
|
93
|
-
require 'core/false_class'
|
|
94
|
-
require 'core/enumerable'
|
|
95
|
-
require 'core/array'
|
|
96
|
-
require 'core/numeric'
|
|
97
|
-
require 'core/hash'
|
|
98
|
-
require 'core/error'
|
|
99
|
-
require 'core/string'
|
|
100
|
-
require 'core/symbol'
|
|
101
|
-
require 'core/proc'
|
|
102
|
-
require 'core/range'
|
|
103
|
-
require 'core/regexp'
|
|
104
|
-
require 'core/match_data'
|
|
105
|
-
require 'core/file'
|
|
106
|
-
require 'core/dir'
|
|
107
|
-
|
|
108
|
-
`var platform = opal.platform;`
|
|
109
|
-
RUBY_PLATFORM = `platform.platform`
|
|
110
|
-
RUBY_ENGINE = `platform.engine`
|
|
111
|
-
RUBY_VERSION = `platform.version`
|
|
112
|
-
|
|
113
|
-
ARGV = `platform.argv`
|
|
114
|
-
|
data/corelib/dir.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
class Dir
|
|
3
|
+
|
|
4
|
+
# Returns a string that is the current working directory for this process.
|
|
5
|
+
#
|
|
6
|
+
# @return [String]
|
|
7
|
+
def self.getwd
|
|
8
|
+
`return Op.fs.cwd;`
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Returns a string that is the current working directory for this process.
|
|
12
|
+
#
|
|
13
|
+
# @return [String]
|
|
14
|
+
def self.pwd
|
|
15
|
+
`return Op.fs.cwd;`
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.[](*a)
|
|
19
|
+
`return Op.fs.glob.apply(Op.fs, a);`
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
File without changes
|
data/corelib/error.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class Exception
|
|
2
|
+
|
|
3
|
+
def initialize(message = '')
|
|
4
|
+
@message = message
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def message
|
|
8
|
+
@message
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def inspect
|
|
12
|
+
`return "#<" + self.$k.__classid__ + ": '" + #{message} + "'>";`
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to_s
|
|
16
|
+
message
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
|
|
2
2
|
class File
|
|
3
|
-
# Use either the browser fs namespace or overriden gem interface.
|
|
4
|
-
`var OPAL_FS = $rb.opal.fs;`
|
|
5
3
|
|
|
6
4
|
# Converts the given `file_name` into its absolute path. The current working
|
|
7
5
|
# directory is used as the reference unless the `dir_string` is given, in
|
|
@@ -12,9 +10,9 @@ class File
|
|
|
12
10
|
# @return [String]
|
|
13
11
|
def self.expand_path(file_name, dir_string = nil)
|
|
14
12
|
if dir_string
|
|
15
|
-
`return
|
|
13
|
+
`return Op.fs.expand_path(file_name, dir_string);`
|
|
16
14
|
else
|
|
17
|
-
`return
|
|
15
|
+
`return Op.fs.expand_path(file_name);`
|
|
18
16
|
end
|
|
19
17
|
end
|
|
20
18
|
|
|
@@ -24,7 +22,7 @@ class File
|
|
|
24
22
|
# @param [String] str
|
|
25
23
|
# @return [String]
|
|
26
24
|
def self.join(*str)
|
|
27
|
-
`return
|
|
25
|
+
`return Op.fs.join.apply(Op.fs, str);`
|
|
28
26
|
end
|
|
29
27
|
|
|
30
28
|
# Returns all the components of the given `file_name` except for the last
|
|
@@ -33,7 +31,7 @@ class File
|
|
|
33
31
|
# @param [String] file_name
|
|
34
32
|
# @return [String]
|
|
35
33
|
def self.dirname(file_name)
|
|
36
|
-
`return
|
|
34
|
+
`return Op.fs.dirname(file_name);`
|
|
37
35
|
end
|
|
38
36
|
|
|
39
37
|
# Returns the extension of the given filename.
|
|
@@ -41,7 +39,7 @@ class File
|
|
|
41
39
|
# @param [String] file_name
|
|
42
40
|
# @return [String]
|
|
43
41
|
def self.extname(file_name)
|
|
44
|
-
`return
|
|
42
|
+
`return Op.fs.extname(file_name);`
|
|
45
43
|
end
|
|
46
44
|
|
|
47
45
|
# Returns the last path component of the given `file_name`. If a suffix is
|
|
@@ -52,11 +50,11 @@ class File
|
|
|
52
50
|
# @param [String] suffix
|
|
53
51
|
# @return [String]
|
|
54
52
|
def self.basename(file_name, suffix)
|
|
55
|
-
`return
|
|
53
|
+
`return Op.fs.basename(file_name, suffix);`
|
|
56
54
|
end
|
|
57
55
|
|
|
58
56
|
def self.exist?(path)
|
|
59
|
-
`return
|
|
57
|
+
`return Op.fs.exist_p(path);`
|
|
60
58
|
end
|
|
61
59
|
end
|
|
62
60
|
|
|
@@ -59,10 +59,10 @@ class Hash
|
|
|
59
59
|
#
|
|
60
60
|
# @return [Array]
|
|
61
61
|
def values
|
|
62
|
-
`var result = [], length = self
|
|
62
|
+
`var result = [], length = self.k.length;
|
|
63
63
|
|
|
64
64
|
for (var i = 0; i < length; i++) {
|
|
65
|
-
result.push(self
|
|
65
|
+
result.push(self.a[self.k[i].$h()]);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
return result;`
|
|
@@ -79,9 +79,9 @@ class Hash
|
|
|
79
79
|
def inspect
|
|
80
80
|
`var description = [], key, value;
|
|
81
81
|
|
|
82
|
-
for (var i = 0
|
|
83
|
-
key = self
|
|
84
|
-
value = self
|
|
82
|
+
for (var i = 0, ii = self.k.length; i < ii; i++) {
|
|
83
|
+
key = self.k[i];
|
|
84
|
+
value = self.a[key.$h()];
|
|
85
85
|
description.push(#{`key`.inspect} + '=>' + #{`value`.inspect});
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -94,9 +94,9 @@ class Hash
|
|
|
94
94
|
def to_s
|
|
95
95
|
`var description = [], key, value;
|
|
96
96
|
|
|
97
|
-
for (var i = 0
|
|
98
|
-
key = self
|
|
99
|
-
value = self
|
|
97
|
+
for (var i = 0, ii = self.k.length; i < ii; i++) {
|
|
98
|
+
key = self.k[i];
|
|
99
|
+
value = self.a[key.$h()];
|
|
100
100
|
description.push(#{`key`.inspect} + #{`value`.inspect});
|
|
101
101
|
}
|
|
102
102
|
|
|
@@ -114,20 +114,11 @@ class Hash
|
|
|
114
114
|
#
|
|
115
115
|
# @return [Hash] returns the receiver
|
|
116
116
|
def each
|
|
117
|
-
`var keys = self
|
|
117
|
+
`var keys = self.k, values = self.a, length = keys.length, key;
|
|
118
118
|
|
|
119
119
|
for (var i = 0; i < length; i++) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
#{yield `key`, `values[key.$hash()]`};
|
|
123
|
-
} catch (e) {
|
|
124
|
-
switch (e.$keyword) {
|
|
125
|
-
case 2:
|
|
126
|
-
return e['@exit_value'];
|
|
127
|
-
default:
|
|
128
|
-
throw e;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
120
|
+
key = keys[i];
|
|
121
|
+
#{yield `key`, `values[key.$h()]`};
|
|
131
122
|
}
|
|
132
123
|
|
|
133
124
|
return self;`
|
|
@@ -147,12 +138,12 @@ class Hash
|
|
|
147
138
|
# @param [Object] obj key to search for
|
|
148
139
|
# @return [Array<Object, Object>, nil] result or nil
|
|
149
140
|
def assoc(obj)
|
|
150
|
-
`var key, keys = self
|
|
141
|
+
`var key, keys = self.k, length = keys.length;
|
|
151
142
|
|
|
152
143
|
for (var i = 0; i < length; i++) {
|
|
153
144
|
key = keys[i];
|
|
154
145
|
if (#{`key` == obj}.$r) {
|
|
155
|
-
return [key, self
|
|
146
|
+
return [key, self.a[key.$h()]];
|
|
156
147
|
}
|
|
157
148
|
}
|
|
158
149
|
|
|
@@ -177,23 +168,23 @@ class Hash
|
|
|
177
168
|
# @param [Hash] other the hash to compare with
|
|
178
169
|
# @return [true, false]
|
|
179
170
|
def ==(other)
|
|
180
|
-
`if (self === other) return
|
|
181
|
-
if (!other
|
|
182
|
-
if (self
|
|
171
|
+
`if (self === other) return true;
|
|
172
|
+
if (!other.k || !other.a) return false;
|
|
173
|
+
if (self.k.length != other.k.length) return false;
|
|
183
174
|
|
|
184
|
-
for (var i = 0; i < self
|
|
185
|
-
var key1 = self
|
|
175
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
176
|
+
var key1 = self.k[i], assoc1 = key1.$h();
|
|
186
177
|
|
|
187
|
-
if (!other
|
|
188
|
-
return
|
|
178
|
+
if (!hasOwnProperty.call(other.a, assoc1))
|
|
179
|
+
return false;
|
|
189
180
|
|
|
190
|
-
var assoc2 = other
|
|
181
|
+
var assoc2 = other.a[assoc1];
|
|
191
182
|
|
|
192
|
-
if (!#{`self
|
|
193
|
-
return
|
|
183
|
+
if (!#{`self.a[assoc1]` == `assoc2`}.$r)
|
|
184
|
+
return false;
|
|
194
185
|
}
|
|
195
186
|
|
|
196
|
-
return
|
|
187
|
+
return true;`
|
|
197
188
|
end
|
|
198
189
|
|
|
199
190
|
# Element reference - retrieves the `value` object corresponding to the `key`
|
|
@@ -210,12 +201,12 @@ class Hash
|
|
|
210
201
|
# @param [Object] key the key to look for
|
|
211
202
|
# @return [Object] result or default value
|
|
212
203
|
def [](key)
|
|
213
|
-
`var assoc = key.$
|
|
204
|
+
`var assoc = key.$h();
|
|
214
205
|
|
|
215
|
-
if (self
|
|
216
|
-
return self
|
|
206
|
+
if (hasOwnProperty.call(self.a, assoc))
|
|
207
|
+
return self.a[assoc];
|
|
217
208
|
|
|
218
|
-
return self
|
|
209
|
+
return self.d;`
|
|
219
210
|
end
|
|
220
211
|
|
|
221
212
|
# Element assignment - Associates the value given by 'value' with the key
|
|
@@ -234,12 +225,12 @@ class Hash
|
|
|
234
225
|
# @param [Object] value the value for the key
|
|
235
226
|
# @return [Object] returns the set value
|
|
236
227
|
def []=(key, value)
|
|
237
|
-
`var assoc = key.$
|
|
228
|
+
`var assoc = key.$h();
|
|
238
229
|
|
|
239
|
-
if (!self
|
|
240
|
-
self
|
|
230
|
+
if (!hasOwnProperty.call(self.a, assoc))
|
|
231
|
+
self.k.push(key);
|
|
241
232
|
|
|
242
|
-
return self
|
|
233
|
+
return self.a[assoc] = value;`
|
|
243
234
|
end
|
|
244
235
|
|
|
245
236
|
# Remove all key-value pairs from `self`.
|
|
@@ -252,15 +243,15 @@ class Hash
|
|
|
252
243
|
#
|
|
253
244
|
# @return [Hash]
|
|
254
245
|
def clear
|
|
255
|
-
`self
|
|
256
|
-
self
|
|
246
|
+
`self.k = [];
|
|
247
|
+
self.a = {};
|
|
257
248
|
|
|
258
249
|
return self;`
|
|
259
250
|
end
|
|
260
251
|
|
|
261
252
|
# Returns the default value for the hash.
|
|
262
253
|
def default
|
|
263
|
-
`return self
|
|
254
|
+
`return self.d;`
|
|
264
255
|
end
|
|
265
256
|
|
|
266
257
|
# Sets the default value - the value returned when a key does not exist.
|
|
@@ -268,7 +259,7 @@ class Hash
|
|
|
268
259
|
# @param [Object] obj the new default
|
|
269
260
|
# @return [Object] returns the new default
|
|
270
261
|
def default=(obj)
|
|
271
|
-
`return self
|
|
262
|
+
`return self.d = obj;`
|
|
272
263
|
end
|
|
273
264
|
|
|
274
265
|
# Deletes and returns a key-value pair from self whose key is equal to `key`.
|
|
@@ -287,16 +278,16 @@ class Hash
|
|
|
287
278
|
# @param [Object] key the key to delete
|
|
288
279
|
# #return [Object] returns value or default value
|
|
289
280
|
def delete(key)
|
|
290
|
-
`var assoc = key.$
|
|
281
|
+
`var assoc = key.$h();
|
|
291
282
|
|
|
292
|
-
if (self
|
|
293
|
-
var ret = self
|
|
294
|
-
delete self
|
|
295
|
-
self
|
|
283
|
+
if (hasOwnProperty.call(self.a, assoc)) {
|
|
284
|
+
var ret = self.a[assoc];
|
|
285
|
+
delete self.a[assoc];
|
|
286
|
+
self.k.splice(self.$keys.indexOf(key), 1);
|
|
296
287
|
return ret;
|
|
297
288
|
}
|
|
298
289
|
|
|
299
|
-
return self
|
|
290
|
+
return self.d;`
|
|
300
291
|
end
|
|
301
292
|
|
|
302
293
|
# Deletes every key-value pair from `self` for which the block evaluates to
|
|
@@ -312,23 +303,14 @@ class Hash
|
|
|
312
303
|
def delete_if
|
|
313
304
|
`var key, value;
|
|
314
305
|
|
|
315
|
-
for (var i = 0; i < self
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
value = self.$assocs[key.$hash()];
|
|
306
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
307
|
+
key = self.k[i];
|
|
308
|
+
value = self.a[key.$h()];
|
|
319
309
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}
|
|
325
|
-
} catch (e) {
|
|
326
|
-
switch (e.$keyword) {
|
|
327
|
-
case 2:
|
|
328
|
-
return e['@exit_value'];
|
|
329
|
-
default:
|
|
330
|
-
throw e;
|
|
331
|
-
}
|
|
310
|
+
if (#{yield `key`, `value`}.$r) {
|
|
311
|
+
delete self.a[key.$h()];
|
|
312
|
+
self.k.splice(i, 1);
|
|
313
|
+
i--;
|
|
332
314
|
}
|
|
333
315
|
}
|
|
334
316
|
|
|
@@ -347,20 +329,8 @@ class Hash
|
|
|
347
329
|
#
|
|
348
330
|
# @return [Hash] returns receiver
|
|
349
331
|
def each_key
|
|
350
|
-
`var
|
|
351
|
-
|
|
352
|
-
for (var i = 0; i < self.$keys.length; i++) {
|
|
353
|
-
try {
|
|
354
|
-
key = self.$keys[i];
|
|
355
|
-
#{yield `key`};
|
|
356
|
-
} catch (e) {
|
|
357
|
-
switch (e.$keyword) {
|
|
358
|
-
case 2:
|
|
359
|
-
return e['@exit_value'];
|
|
360
|
-
default:
|
|
361
|
-
throw e;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
332
|
+
`for (var i = 0, ii = self.k.length; i < ii; i++) {
|
|
333
|
+
#{yield `self.k[i]`};
|
|
364
334
|
}
|
|
365
335
|
|
|
366
336
|
return self;`
|
|
@@ -380,18 +350,8 @@ class Hash
|
|
|
380
350
|
def each_value
|
|
381
351
|
`var val;
|
|
382
352
|
|
|
383
|
-
for (var i = 0
|
|
384
|
-
|
|
385
|
-
val = self.$assocs[self.$keys[i].$hash()];
|
|
386
|
-
#{yield `val`};
|
|
387
|
-
} catch (e) {
|
|
388
|
-
switch (e.$keyword) {
|
|
389
|
-
case 2:
|
|
390
|
-
return e['@exit_value'];
|
|
391
|
-
default:
|
|
392
|
-
throw e;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
353
|
+
for (var i = 0, ii = self.k.length; i < ii; i++) {
|
|
354
|
+
#{yield `self.a[self.k[i].$h()]`};
|
|
395
355
|
}
|
|
396
356
|
|
|
397
357
|
return self;`
|
|
@@ -406,7 +366,7 @@ class Hash
|
|
|
406
366
|
#
|
|
407
367
|
# @return [true, false]
|
|
408
368
|
def empty?
|
|
409
|
-
`return self
|
|
369
|
+
`return self.k.length == 0;`
|
|
410
370
|
end
|
|
411
371
|
|
|
412
372
|
# Returns a value from the hash for the given key. If the key can't be found,
|
|
@@ -426,7 +386,7 @@ class Hash
|
|
|
426
386
|
# @param [Object] defaults the default value to return
|
|
427
387
|
# @return [Object] value from hash
|
|
428
388
|
def fetch(key, defaults = `undefined`)
|
|
429
|
-
`var value = self
|
|
389
|
+
`var value = self.a[key.$h()];
|
|
430
390
|
|
|
431
391
|
if (value != undefined)
|
|
432
392
|
return value;
|
|
@@ -455,9 +415,9 @@ class Hash
|
|
|
455
415
|
def flatten(level = 1)
|
|
456
416
|
`var result = [], key, value;
|
|
457
417
|
|
|
458
|
-
for (var i = 0; i < self
|
|
459
|
-
key = self
|
|
460
|
-
value = self
|
|
418
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
419
|
+
key = self.k[i];
|
|
420
|
+
value = self.a[key.$h()];
|
|
461
421
|
result.push(key);
|
|
462
422
|
|
|
463
423
|
if (value instanceof Array) {
|
|
@@ -488,10 +448,10 @@ class Hash
|
|
|
488
448
|
# @param [Object] key the key to check
|
|
489
449
|
# @return [true, false]
|
|
490
450
|
def has_key?(key)
|
|
491
|
-
`if (self
|
|
492
|
-
return
|
|
451
|
+
`if (hasOwnProperty.call(self.a, key.$h()))
|
|
452
|
+
return true;
|
|
493
453
|
|
|
494
|
-
return
|
|
454
|
+
return false;`
|
|
495
455
|
end
|
|
496
456
|
|
|
497
457
|
# Returns `true` if the given `value` is present for some key in `self`.
|
|
@@ -509,15 +469,15 @@ class Hash
|
|
|
509
469
|
def has_value?(value)
|
|
510
470
|
`var key, value;
|
|
511
471
|
|
|
512
|
-
for (var i = 0; i < self
|
|
513
|
-
key = self
|
|
514
|
-
val = self
|
|
472
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
473
|
+
key = self.k[i];
|
|
474
|
+
val = self.a[key.$h()];
|
|
515
475
|
|
|
516
476
|
if (#{`value` == `val`}.$r)
|
|
517
|
-
return
|
|
477
|
+
return true;
|
|
518
478
|
}
|
|
519
479
|
|
|
520
|
-
return
|
|
480
|
+
return false;`
|
|
521
481
|
end
|
|
522
482
|
|
|
523
483
|
# Replaces the contents of `self` with the contents of `other`.
|
|
@@ -531,13 +491,13 @@ class Hash
|
|
|
531
491
|
# @param [Hash] other hash to replace with
|
|
532
492
|
# @return [Hash] returns receiver
|
|
533
493
|
def replace(other)
|
|
534
|
-
`self
|
|
494
|
+
`self.k = []; self.a = {};
|
|
535
495
|
|
|
536
|
-
for (var i = 0; i < other
|
|
537
|
-
var key = other
|
|
538
|
-
var val = other
|
|
539
|
-
self
|
|
540
|
-
self
|
|
496
|
+
for (var i = 0; i < other.k.length; i++) {
|
|
497
|
+
var key = other.k[i];
|
|
498
|
+
var val = other.a[key.$h()];
|
|
499
|
+
self.k.push(key);
|
|
500
|
+
self.a[key.$h()] = val;
|
|
541
501
|
}
|
|
542
502
|
|
|
543
503
|
return self;`
|
|
@@ -572,9 +532,9 @@ class Hash
|
|
|
572
532
|
def key(value)
|
|
573
533
|
`var key, val;
|
|
574
534
|
|
|
575
|
-
for (var i = 0; i < self
|
|
576
|
-
key = self
|
|
577
|
-
val = self
|
|
535
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
536
|
+
key = self.k[i];
|
|
537
|
+
val = self.a[key.$h()];
|
|
578
538
|
|
|
579
539
|
if (#{`value` == `val`}.$r) {
|
|
580
540
|
return key;
|
|
@@ -595,7 +555,7 @@ class Hash
|
|
|
595
555
|
#
|
|
596
556
|
# @return [Array]
|
|
597
557
|
def keys
|
|
598
|
-
`return self
|
|
558
|
+
`return self.k.slice(0);`
|
|
599
559
|
end
|
|
600
560
|
|
|
601
561
|
# Returns the number of key-value pairs in the hash.
|
|
@@ -608,7 +568,7 @@ class Hash
|
|
|
608
568
|
#
|
|
609
569
|
# @return [Numeric]
|
|
610
570
|
def length
|
|
611
|
-
`return self
|
|
571
|
+
`return self.k.length;`
|
|
612
572
|
end
|
|
613
573
|
|
|
614
574
|
# Returns a new hash containing the contents of `other` and `self`. If no
|
|
@@ -631,21 +591,21 @@ class Hash
|
|
|
631
591
|
def merge(other)
|
|
632
592
|
`var result = $opal.H() , key, val;
|
|
633
593
|
|
|
634
|
-
for (var i = 0; i < self
|
|
635
|
-
key = self
|
|
594
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
595
|
+
key = self.k[i], val = self.a[key.$h()];
|
|
636
596
|
|
|
637
|
-
result
|
|
638
|
-
result
|
|
597
|
+
result.k.push(key);
|
|
598
|
+
result.a[key.$h()] = val;
|
|
639
599
|
}
|
|
640
600
|
|
|
641
|
-
for (var i = 0; i < other
|
|
642
|
-
key = other
|
|
601
|
+
for (var i = 0; i < other.k.length; i++) {
|
|
602
|
+
key = other.k[i], val = other.a[key.$h()];
|
|
643
603
|
|
|
644
|
-
if (!result
|
|
645
|
-
result
|
|
604
|
+
if (!hasOwnProperty.call(result.a, key.$h())) {
|
|
605
|
+
result.k.push(key);
|
|
646
606
|
}
|
|
647
607
|
|
|
648
|
-
result
|
|
608
|
+
result.a[key.$h()] = val;
|
|
649
609
|
}
|
|
650
610
|
|
|
651
611
|
return result;`
|
|
@@ -668,15 +628,15 @@ class Hash
|
|
|
668
628
|
def merge!(other)
|
|
669
629
|
`var key, val;
|
|
670
630
|
|
|
671
|
-
for (var i = 0; i < other
|
|
672
|
-
key = other
|
|
673
|
-
val = other
|
|
631
|
+
for (var i = 0; i < other.k.length; i++) {
|
|
632
|
+
key = other.k[i];
|
|
633
|
+
val = other.a[key.$h()];
|
|
674
634
|
|
|
675
|
-
if (!self
|
|
676
|
-
self
|
|
635
|
+
if (!hasOwnProperty.call(self.a, key.$h())) {
|
|
636
|
+
self.k.push(key);
|
|
677
637
|
}
|
|
678
638
|
|
|
679
|
-
self
|
|
639
|
+
self.a[key.$h()] = val;
|
|
680
640
|
}
|
|
681
641
|
|
|
682
642
|
return self;`
|
|
@@ -698,9 +658,9 @@ class Hash
|
|
|
698
658
|
def rassoc(obj)
|
|
699
659
|
`var key, val;
|
|
700
660
|
|
|
701
|
-
for (var i = 0; i < self
|
|
702
|
-
key = self
|
|
703
|
-
val = self
|
|
661
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
662
|
+
key = self.k[i];
|
|
663
|
+
val = self.a[key.$h()];
|
|
704
664
|
|
|
705
665
|
if (#{`val` == obj}.$r)
|
|
706
666
|
return [key, val];
|
|
@@ -726,16 +686,16 @@ class Hash
|
|
|
726
686
|
def shift
|
|
727
687
|
`var key, val;
|
|
728
688
|
|
|
729
|
-
if (self
|
|
730
|
-
key = self
|
|
731
|
-
val = self
|
|
689
|
+
if (self.k.length > 0) {
|
|
690
|
+
key = self.k[0];
|
|
691
|
+
val = self.a[key.$h()];
|
|
732
692
|
|
|
733
|
-
self
|
|
734
|
-
delete self
|
|
693
|
+
self.k.shift();
|
|
694
|
+
delete self.a[key.$h()];
|
|
735
695
|
return [key, val];
|
|
736
696
|
}
|
|
737
697
|
|
|
738
|
-
return self
|
|
698
|
+
return self.d;`
|
|
739
699
|
end
|
|
740
700
|
|
|
741
701
|
# Convert self into a nested array of `[key, value]` arrays.
|
|
@@ -750,9 +710,9 @@ class Hash
|
|
|
750
710
|
def to_a
|
|
751
711
|
`var result = [], key, value;
|
|
752
712
|
|
|
753
|
-
for (var i = 0; i < self
|
|
754
|
-
key = self
|
|
755
|
-
value = self
|
|
713
|
+
for (var i = 0; i < self.k.length; i++) {
|
|
714
|
+
key = self.k[i];
|
|
715
|
+
value = self.a[key.$h()];
|
|
756
716
|
result.push([key, value]);
|
|
757
717
|
}
|
|
758
718
|
|