opal 0.3.44 → 0.4.0
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/.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/proc.rb
CHANGED
data/opal/opal/range.rb
CHANGED
data/opal/opal/regexp.rb
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
class Regexp
|
|
2
|
+
`def._isRegexp = true`
|
|
3
|
+
|
|
2
4
|
def self.escape(string)
|
|
3
5
|
`string.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\^\\$\\|]/g, '\\\\$&')`
|
|
4
6
|
end
|
|
5
7
|
|
|
6
8
|
def self.new(regexp, options = undefined)
|
|
7
|
-
`new RegExp(regexp, options)`
|
|
9
|
+
`options? new RegExp(regexp, options) : new RegExp(regexp)`
|
|
8
10
|
end
|
|
9
11
|
|
|
10
12
|
def ==(other)
|
|
11
13
|
`other.constructor == RegExp && #{self}.toString() === other.toString()`
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
def ===(str)
|
|
17
|
+
`#{self}.test(str)`
|
|
18
|
+
end
|
|
15
19
|
|
|
16
20
|
def =~(string)
|
|
17
21
|
%x{
|
|
@@ -40,7 +44,9 @@ class Regexp
|
|
|
40
44
|
|
|
41
45
|
alias eql? ==
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
def inspect
|
|
48
|
+
`#{self}.toString()`
|
|
49
|
+
end
|
|
44
50
|
|
|
45
51
|
def match(string, pos = undefined)
|
|
46
52
|
%x{
|
|
@@ -69,4 +75,8 @@ class Regexp
|
|
|
69
75
|
end
|
|
70
76
|
|
|
71
77
|
alias to_s source
|
|
78
|
+
|
|
79
|
+
def to_n
|
|
80
|
+
self
|
|
81
|
+
end
|
|
72
82
|
end
|
data/opal/opal/runtime.js
CHANGED
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
Opal.klass = function(base, superklass, id, constructor) {
|
|
79
79
|
var klass;
|
|
80
80
|
if (typeof(base) !== 'function') {
|
|
81
|
-
base = base.
|
|
81
|
+
base = base.constructor;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
if (superklass === null) {
|
|
@@ -87,16 +87,17 @@
|
|
|
87
87
|
|
|
88
88
|
if (__hasOwn.call(base._scope, id)) {
|
|
89
89
|
klass = base._scope[id];
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
var bridged = superklass;
|
|
94
|
-
superklass = Object;
|
|
95
|
-
klass = bridge_class(bridged);
|
|
90
|
+
|
|
91
|
+
if (typeof klass !== 'function') {
|
|
92
|
+
throw Opal.TypeError.$new(id + " is not a class");
|
|
96
93
|
}
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
|
|
95
|
+
if (superklass !== klass._super && superklass !== Object) {
|
|
96
|
+
throw Opal.TypeError.$new("superclass mismatch for class " + id);
|
|
99
97
|
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
klass = boot_class(superklass, constructor);
|
|
100
101
|
|
|
101
102
|
klass._name = (base === Object ? id : base._name + '::' + id);
|
|
102
103
|
|
|
@@ -116,23 +117,28 @@
|
|
|
116
117
|
Opal.module = function(base, id, constructor) {
|
|
117
118
|
var klass;
|
|
118
119
|
if (typeof(base) !== 'function') {
|
|
119
|
-
base = base.
|
|
120
|
+
base = base.constructor;
|
|
120
121
|
}
|
|
121
122
|
|
|
122
123
|
if (__hasOwn.call(base._scope, id)) {
|
|
123
124
|
klass = base._scope[id];
|
|
125
|
+
|
|
126
|
+
if (!klass._mod$ && klass !== Object) {
|
|
127
|
+
throw Opal.TypeError.$new(id + " is not a module")
|
|
128
|
+
}
|
|
124
129
|
}
|
|
125
130
|
else {
|
|
126
131
|
klass = boot_class(Class, constructor);
|
|
127
132
|
klass._name = (base === Object ? id : base._name + '::' + id);
|
|
133
|
+
klass._mod$ = true;
|
|
128
134
|
|
|
129
|
-
klass
|
|
135
|
+
klass._included_in = [];
|
|
130
136
|
|
|
131
137
|
create_scope(base._scope, klass, id);
|
|
132
138
|
}
|
|
133
139
|
|
|
134
140
|
return klass;
|
|
135
|
-
}
|
|
141
|
+
};
|
|
136
142
|
|
|
137
143
|
// Utility function to raise a "no block given" error
|
|
138
144
|
var no_block_given = function() {
|
|
@@ -151,10 +157,8 @@
|
|
|
151
157
|
var prototype = constructor.prototype;
|
|
152
158
|
|
|
153
159
|
prototype.constructor = constructor;
|
|
154
|
-
prototype.
|
|
160
|
+
prototype.constructor = constructor;
|
|
155
161
|
|
|
156
|
-
constructor._inherited = [];
|
|
157
|
-
constructor._included_in = [];
|
|
158
162
|
constructor._name = id;
|
|
159
163
|
constructor._super = superklass;
|
|
160
164
|
constructor._methods = [];
|
|
@@ -177,21 +181,18 @@
|
|
|
177
181
|
constructor.prototype = new ctor();
|
|
178
182
|
var prototype = constructor.prototype;
|
|
179
183
|
|
|
180
|
-
prototype._klass = constructor;
|
|
181
184
|
prototype.constructor = constructor;
|
|
182
185
|
|
|
183
|
-
constructor._inherited = [];
|
|
184
|
-
constructor._included_in = [];
|
|
185
186
|
constructor._super = superklass;
|
|
186
187
|
constructor._methods = [];
|
|
187
|
-
constructor.
|
|
188
|
+
constructor.constructor = Class;
|
|
188
189
|
|
|
189
|
-
constructor['$===']
|
|
190
|
-
constructor.$to_s
|
|
190
|
+
constructor['$==='] = module_eqq;
|
|
191
|
+
constructor.$to_s = module_to_s;
|
|
191
192
|
constructor.toString = module_to_s;
|
|
192
193
|
|
|
193
194
|
constructor['$[]'] = undefined;
|
|
194
|
-
constructor
|
|
195
|
+
constructor.$call = undefined;
|
|
195
196
|
|
|
196
197
|
var smethods;
|
|
197
198
|
|
|
@@ -203,28 +204,34 @@
|
|
|
203
204
|
constructor[m] = superklass[m];
|
|
204
205
|
}
|
|
205
206
|
|
|
206
|
-
superklass._inherited
|
|
207
|
+
var inherited = superklass._inherited;
|
|
208
|
+
|
|
209
|
+
if (!inherited) {
|
|
210
|
+
inherited = superklass._inherited = [];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
inherited.push(constructor);
|
|
207
214
|
|
|
208
215
|
return constructor;
|
|
209
216
|
};
|
|
210
217
|
|
|
211
218
|
var bridge_class = function(constructor) {
|
|
212
|
-
|
|
219
|
+
var i, length, m;
|
|
220
|
+
|
|
221
|
+
constructor.prototype.constructor = constructor;
|
|
213
222
|
|
|
214
|
-
constructor._inherited = [];
|
|
215
|
-
constructor._included_in = [];
|
|
216
223
|
constructor._super = Object;
|
|
217
|
-
constructor.
|
|
224
|
+
constructor.constructor = Class;
|
|
218
225
|
constructor._methods = [];
|
|
219
226
|
constructor._smethods = [];
|
|
220
227
|
|
|
221
|
-
constructor['$===']
|
|
222
|
-
constructor.$to_s
|
|
228
|
+
constructor['$==='] = module_eqq;
|
|
229
|
+
constructor.$to_s = module_to_s;
|
|
223
230
|
constructor.toString = module_to_s;
|
|
224
231
|
|
|
225
232
|
var smethods = constructor._smethods = Class._methods.slice();
|
|
226
|
-
for (
|
|
227
|
-
|
|
233
|
+
for (i = 0, length = smethods.length; i < length; i++) {
|
|
234
|
+
m = smethods[i];
|
|
228
235
|
constructor[m] = Object[m];
|
|
229
236
|
}
|
|
230
237
|
|
|
@@ -232,8 +239,8 @@
|
|
|
232
239
|
|
|
233
240
|
var table = Object.prototype, methods = Object._methods;
|
|
234
241
|
|
|
235
|
-
for (
|
|
236
|
-
|
|
242
|
+
for (i = 0, length = methods.length; i < length; i++) {
|
|
243
|
+
m = methods[i];
|
|
237
244
|
constructor.prototype[m] = table[m];
|
|
238
245
|
}
|
|
239
246
|
|
|
@@ -244,6 +251,25 @@
|
|
|
244
251
|
|
|
245
252
|
Opal.puts = function(a) { console.log(a); };
|
|
246
253
|
|
|
254
|
+
var native_singleton = {
|
|
255
|
+
_scope: Opal,
|
|
256
|
+
prototype: null
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// Singleton class
|
|
260
|
+
Opal.singleton = function(obj) {
|
|
261
|
+
if (obj == null) {
|
|
262
|
+
return Opal.NilClass;
|
|
263
|
+
}
|
|
264
|
+
else if (obj.$singleton_class) {
|
|
265
|
+
return obj.$singleton_class();
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
native_singleton.prototype = obj;
|
|
269
|
+
return native_singleton;
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
|
|
247
273
|
// Method missing dispatcher
|
|
248
274
|
Opal.mm = function(mid) {
|
|
249
275
|
var dispatcher = function() {
|
|
@@ -254,6 +280,7 @@
|
|
|
254
280
|
return this.$method_missing.apply(this, [mid].concat(args));
|
|
255
281
|
}
|
|
256
282
|
else {
|
|
283
|
+
native_send._p = dispatcher._p;
|
|
257
284
|
return native_send(this, mid, args);
|
|
258
285
|
}
|
|
259
286
|
};
|
|
@@ -266,25 +293,31 @@
|
|
|
266
293
|
var prop, block = native_send._p;
|
|
267
294
|
native_send._p = null;
|
|
268
295
|
|
|
269
|
-
if (prop = native_methods[mid]) {
|
|
296
|
+
if ( (prop = native_methods[mid]) ) {
|
|
270
297
|
return prop(obj, args, block);
|
|
271
298
|
}
|
|
272
299
|
|
|
273
300
|
prop = obj[mid];
|
|
274
301
|
|
|
275
302
|
if (typeof(prop) === "function") {
|
|
276
|
-
prop = prop.apply(obj, args.$
|
|
303
|
+
prop = prop.apply(obj, args.$to_n());
|
|
277
304
|
}
|
|
278
305
|
else if (mid.charAt(mid.length - 1) === "=") {
|
|
279
306
|
prop = mid.slice(0, mid.length - 1);
|
|
307
|
+
|
|
308
|
+
if (args[0] === nil) {
|
|
309
|
+
obj[prop] = null;
|
|
310
|
+
return nil;
|
|
311
|
+
}
|
|
312
|
+
|
|
280
313
|
return obj[prop] = args[0];
|
|
281
314
|
}
|
|
282
315
|
|
|
283
|
-
if (prop
|
|
284
|
-
return
|
|
316
|
+
if (prop == null) {
|
|
317
|
+
return nil;
|
|
285
318
|
}
|
|
286
319
|
|
|
287
|
-
return
|
|
320
|
+
return prop;
|
|
288
321
|
};
|
|
289
322
|
|
|
290
323
|
var native_methods = {
|
|
@@ -295,11 +328,29 @@
|
|
|
295
328
|
"[]": function(obj, args) {
|
|
296
329
|
var prop = obj[args[0]];
|
|
297
330
|
|
|
298
|
-
if (prop
|
|
299
|
-
return
|
|
331
|
+
if (prop == null) {
|
|
332
|
+
return nil;
|
|
300
333
|
}
|
|
301
334
|
|
|
302
|
-
return
|
|
335
|
+
return prop;
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
"[]=": function(obj, args) {
|
|
339
|
+
var value = args[1];
|
|
340
|
+
|
|
341
|
+
if (value === nil) {
|
|
342
|
+
value = null;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return obj[args[0]] = value;
|
|
346
|
+
},
|
|
347
|
+
|
|
348
|
+
"inspect": function(obj) {
|
|
349
|
+
return obj.toString();
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
"to_s": function(obj) {
|
|
353
|
+
return obj.toString();
|
|
303
354
|
},
|
|
304
355
|
|
|
305
356
|
"respond_to?": function(obj, args) {
|
|
@@ -343,6 +394,23 @@
|
|
|
343
394
|
}
|
|
344
395
|
|
|
345
396
|
return result;
|
|
397
|
+
},
|
|
398
|
+
|
|
399
|
+
"to_h": function(obj) {
|
|
400
|
+
var keys = [], values = {}, value;
|
|
401
|
+
|
|
402
|
+
for (var key in obj) {
|
|
403
|
+
value = obj[key];
|
|
404
|
+
keys.push(key);
|
|
405
|
+
|
|
406
|
+
if (value == null) {
|
|
407
|
+
value = nil;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
values[key] = value;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return Opal.hash2(keys, values);
|
|
346
414
|
}
|
|
347
415
|
};
|
|
348
416
|
|
|
@@ -353,8 +421,8 @@
|
|
|
353
421
|
|
|
354
422
|
// Arity count error dispatcher
|
|
355
423
|
Opal.ac = function(actual, expected, object, meth) {
|
|
356
|
-
var inspect = ((typeof(object) !== 'function') ? object.
|
|
357
|
-
var msg = '[' + inspect + '] wrong number of arguments(' + actual + ' for ' + expected + ')'
|
|
424
|
+
var inspect = ((typeof(object) !== 'function') ? object.constructor._name + '#' : object._name + '.') + meth;
|
|
425
|
+
var msg = '[' + inspect + '] wrong number of arguments(' + actual + ' for ' + expected + ')';
|
|
358
426
|
throw Opal.ArgumentError.$new(msg);
|
|
359
427
|
};
|
|
360
428
|
|
|
@@ -384,13 +452,25 @@
|
|
|
384
452
|
return recv.$method_missing.apply(recv, [mid].concat(args));
|
|
385
453
|
};
|
|
386
454
|
|
|
455
|
+
Opal.block_send = function(recv, mid, block) {
|
|
456
|
+
var args = __slice.call(arguments, 3),
|
|
457
|
+
func = recv['$' + mid];
|
|
458
|
+
|
|
459
|
+
if (func) {
|
|
460
|
+
func._p = block;
|
|
461
|
+
return func.apply(recv, args);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
return recv.$method_missing.apply(recv, [mid].concat(args));
|
|
465
|
+
};
|
|
466
|
+
|
|
387
467
|
// Implementation of Class#===
|
|
388
468
|
function module_eqq(object) {
|
|
389
469
|
if (object == null) {
|
|
390
470
|
return false;
|
|
391
471
|
}
|
|
392
472
|
|
|
393
|
-
var search = object.
|
|
473
|
+
var search = object.constructor;
|
|
394
474
|
|
|
395
475
|
while (search) {
|
|
396
476
|
if (search === this) {
|
|
@@ -412,7 +492,7 @@
|
|
|
412
492
|
* Donate methods for a class/module
|
|
413
493
|
*/
|
|
414
494
|
Opal.donate = function(klass, defined, indirect) {
|
|
415
|
-
var methods = klass._methods, included_in = klass
|
|
495
|
+
var methods = klass._methods, included_in = klass._included_in;
|
|
416
496
|
|
|
417
497
|
// if (!indirect) {
|
|
418
498
|
klass._methods = methods.concat(defined);
|
|
@@ -428,7 +508,7 @@
|
|
|
428
508
|
dest[method] = klass.prototype[method];
|
|
429
509
|
}
|
|
430
510
|
|
|
431
|
-
if (includee
|
|
511
|
+
if (includee._included_in) {
|
|
432
512
|
Opal.donate(includee, defined, true);
|
|
433
513
|
}
|
|
434
514
|
}
|
|
@@ -449,7 +529,7 @@
|
|
|
449
529
|
klass[mid] = body;
|
|
450
530
|
|
|
451
531
|
var inherited = klass._inherited;
|
|
452
|
-
if (inherited.length) {
|
|
532
|
+
if (inherited && inherited.length) {
|
|
453
533
|
for (var i = 0, length = inherited.length, subclass; i < length; i++) {
|
|
454
534
|
subclass = inherited[i];
|
|
455
535
|
if (!subclass[mid]) {
|
|
@@ -468,16 +548,16 @@
|
|
|
468
548
|
// Initialization
|
|
469
549
|
// --------------
|
|
470
550
|
|
|
471
|
-
boot_defclass('BasicObject', BasicObject)
|
|
551
|
+
boot_defclass('BasicObject', BasicObject);
|
|
472
552
|
boot_defclass('Object', Object, BasicObject);
|
|
473
553
|
boot_defclass('Class', Class, Object);
|
|
474
554
|
|
|
475
555
|
Class.prototype = Function.prototype;
|
|
476
556
|
|
|
477
|
-
BasicObject.
|
|
557
|
+
BasicObject.constructor = Object.constructor = Class.constructor = Class;
|
|
478
558
|
|
|
479
559
|
|
|
480
|
-
var bridged_classes = Object
|
|
560
|
+
var bridged_classes = Object._included_in = [];
|
|
481
561
|
|
|
482
562
|
Opal.base = Object;
|
|
483
563
|
BasicObject._scope = Object._scope = Opal;
|
|
@@ -492,7 +572,8 @@
|
|
|
492
572
|
|
|
493
573
|
Opal.top = new Object;
|
|
494
574
|
|
|
495
|
-
Opal.klass(Object, Object, 'NilClass', NilClass)
|
|
575
|
+
Opal.klass(Object, Object, 'NilClass', NilClass);
|
|
576
|
+
|
|
496
577
|
var nil = Opal.nil = new NilClass;
|
|
497
578
|
nil.call = nil.apply = function() { throw Opal.LocalJumpError.$new('no block given'); };
|
|
498
579
|
|
|
@@ -506,4 +587,6 @@
|
|
|
506
587
|
Opal.bridge('Exception', Error);
|
|
507
588
|
Opal.bridge('Regexp', RegExp);
|
|
508
589
|
Opal.bridge('Time', Date);
|
|
590
|
+
|
|
591
|
+
TypeError._super = Error;
|
|
509
592
|
}).call(this);
|
data/opal/opal/string.rb
CHANGED
|
@@ -197,7 +197,7 @@ class String
|
|
|
197
197
|
var result = #{self}.substr(0, strlen - 1);
|
|
198
198
|
if (strlen > 1 && #{self}.charAt(strlen - 2) === "\\r") {
|
|
199
199
|
result = #{self}.substr(0, strlen - 2);
|
|
200
|
-
}
|
|
200
|
+
}
|
|
201
201
|
return result;
|
|
202
202
|
}
|
|
203
203
|
}
|
|
@@ -233,7 +233,9 @@ class String
|
|
|
233
233
|
|
|
234
234
|
alias dup clone
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
def downcase
|
|
237
|
+
`#{self}.toLowerCase()`
|
|
238
|
+
end
|
|
237
239
|
|
|
238
240
|
alias each_char chars
|
|
239
241
|
|
|
@@ -294,7 +296,9 @@ class String
|
|
|
294
296
|
`#{self}.toString() === val.toString()`
|
|
295
297
|
end
|
|
296
298
|
|
|
297
|
-
|
|
299
|
+
def getbyte(idx)
|
|
300
|
+
`#{self}.charCodeAt(idx)`
|
|
301
|
+
end
|
|
298
302
|
|
|
299
303
|
def gsub(pattern, replace = undefined, &block)
|
|
300
304
|
if pattern.is_a?(String)
|
|
@@ -311,7 +315,9 @@ class String
|
|
|
311
315
|
}
|
|
312
316
|
end
|
|
313
317
|
|
|
314
|
-
|
|
318
|
+
def hash
|
|
319
|
+
`#{self}.toString()`
|
|
320
|
+
end
|
|
315
321
|
|
|
316
322
|
def hex
|
|
317
323
|
to_i 16
|
|
@@ -321,36 +327,37 @@ class String
|
|
|
321
327
|
`#{self}.indexOf(other) !== -1`
|
|
322
328
|
end
|
|
323
329
|
|
|
324
|
-
def index(what, offset)
|
|
330
|
+
def index(what, offset = nil)
|
|
325
331
|
%x{
|
|
326
|
-
if (!what._isString
|
|
327
|
-
|
|
332
|
+
if ( !(what != null && (what._isString || what._isRegexp)) ) {
|
|
333
|
+
#{raise TypeError, 'type mismatch'};
|
|
328
334
|
}
|
|
329
335
|
|
|
330
336
|
var result = -1;
|
|
331
337
|
|
|
332
338
|
if (offset != null) {
|
|
333
339
|
if (offset < 0) {
|
|
334
|
-
offset = #{self}.length
|
|
340
|
+
offset = offset + #{self}.length;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (offset > #{self}.length) {
|
|
344
|
+
return nil;
|
|
335
345
|
}
|
|
336
346
|
|
|
337
347
|
if (#{what.is_a?(Regexp)}) {
|
|
338
348
|
result = #{what =~ `#{self}.substr(offset)` || -1}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
result = #{self}.substr(offset).indexOf(substr);
|
|
349
|
+
} else {
|
|
350
|
+
result = #{self}.substr(offset).indexOf(#{what});
|
|
342
351
|
}
|
|
343
352
|
|
|
344
353
|
if (result !== -1) {
|
|
345
354
|
result += offset;
|
|
346
355
|
}
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
356
|
+
} else {
|
|
349
357
|
if (#{what.is_a?(Regexp)}) {
|
|
350
358
|
result = #{(what =~ self) || -1}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
result = #{self}.indexOf(substr);
|
|
359
|
+
} else {
|
|
360
|
+
result = #{self}.indexOf(#{what});
|
|
354
361
|
}
|
|
355
362
|
}
|
|
356
363
|
|
|
@@ -479,7 +486,7 @@ class String
|
|
|
479
486
|
result = #{self}.lastIndexOf(search);
|
|
480
487
|
}
|
|
481
488
|
else {
|
|
482
|
-
result = #{self}.$reverse().search(search);
|
|
489
|
+
result = #{self}.$reverse().search(search);
|
|
483
490
|
if (result !== -1) {
|
|
484
491
|
result = #{self}.length - 1 - result;
|
|
485
492
|
}
|
|
@@ -638,7 +645,7 @@ class String
|
|
|
638
645
|
return $1 ? $0.toUpperCase() : $0.toLowerCase();
|
|
639
646
|
});
|
|
640
647
|
|
|
641
|
-
if (#{self}.
|
|
648
|
+
if (#{self}.constructor === String) {
|
|
642
649
|
return str;
|
|
643
650
|
}
|
|
644
651
|
|
|
@@ -689,7 +696,9 @@ class String
|
|
|
689
696
|
}
|
|
690
697
|
end
|
|
691
698
|
|
|
692
|
-
|
|
699
|
+
def to_s
|
|
700
|
+
`#{self}.toString()`
|
|
701
|
+
end
|
|
693
702
|
|
|
694
703
|
alias to_str to_s
|
|
695
704
|
|
|
@@ -809,7 +818,7 @@ class String
|
|
|
809
818
|
to_chars.push(pad_char);
|
|
810
819
|
}
|
|
811
820
|
}
|
|
812
|
-
|
|
821
|
+
|
|
813
822
|
for (var i = 0; i < from_length; i++) {
|
|
814
823
|
subs[from_chars[i]] = to_chars[i];
|
|
815
824
|
}
|
|
@@ -944,7 +953,7 @@ class String
|
|
|
944
953
|
to_chars.push(pad_char);
|
|
945
954
|
}
|
|
946
955
|
}
|
|
947
|
-
|
|
956
|
+
|
|
948
957
|
for (var i = 0; i < from_length; i++) {
|
|
949
958
|
subs[from_chars[i]] = to_chars[i];
|
|
950
959
|
}
|
|
@@ -983,7 +992,17 @@ class String
|
|
|
983
992
|
}
|
|
984
993
|
end
|
|
985
994
|
|
|
986
|
-
|
|
995
|
+
def upcase
|
|
996
|
+
`#{self}.toUpperCase()`
|
|
997
|
+
end
|
|
998
|
+
|
|
999
|
+
def freeze
|
|
1000
|
+
self
|
|
1001
|
+
end
|
|
1002
|
+
|
|
1003
|
+
def frozen?
|
|
1004
|
+
true
|
|
1005
|
+
end
|
|
987
1006
|
end
|
|
988
1007
|
|
|
989
1008
|
Symbol = String
|
|
@@ -1042,6 +1061,10 @@ class MatchData < Array
|
|
|
1042
1061
|
`#{self}[0]`
|
|
1043
1062
|
end
|
|
1044
1063
|
|
|
1064
|
+
def to_n
|
|
1065
|
+
self
|
|
1066
|
+
end
|
|
1067
|
+
|
|
1045
1068
|
def values_at(*indexes)
|
|
1046
1069
|
%x{
|
|
1047
1070
|
var vals = [];
|