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.
Files changed (109) hide show
  1. data/.travis.yml +0 -1
  2. data/CHANGELOG.md +52 -0
  3. data/README.md +3 -3
  4. data/Rakefile +32 -8
  5. data/bin/opal +69 -16
  6. data/config.ru +1 -1
  7. data/examples/native/app/app.rb +28 -9
  8. data/examples/rack/app/app.rb +1 -1
  9. data/lib/opal.rb +0 -1
  10. data/lib/opal/cli.rb +106 -0
  11. data/lib/opal/lexer.rb +4 -2
  12. data/lib/opal/parser.rb +603 -360
  13. data/lib/opal/processor.rb +20 -8
  14. data/lib/opal/server.rb +47 -0
  15. data/lib/opal/source_map.rb +63 -0
  16. data/lib/opal/sprockets_parser.rb +77 -0
  17. data/lib/opal/sprockets_source_map_header.rb +21 -0
  18. data/lib/opal/target_scope.rb +14 -7
  19. data/lib/opal/version.rb +1 -1
  20. data/opal.gemspec +2 -0
  21. data/opal/opal-browser/script_loader.rb +7 -7
  22. data/opal/opal-parser.js.erb +2 -2
  23. data/opal/opal-source-maps.js.erb +2 -0
  24. data/opal/opal.rb +3 -4
  25. data/opal/opal/array.rb +31 -28
  26. data/opal/opal/boolean.rb +4 -0
  27. data/opal/opal/class.rb +14 -5
  28. data/opal/opal/enumerable.rb +68 -8
  29. data/opal/opal/error.rb +1 -1
  30. data/opal/opal/hash.rb +15 -18
  31. data/opal/opal/kernel.rb +24 -10
  32. data/opal/opal/native.rb +31 -0
  33. data/opal/opal/nil_class.rb +7 -2
  34. data/opal/opal/numeric.rb +10 -1
  35. data/opal/opal/proc.rb +4 -0
  36. data/opal/opal/range.rb +1 -1
  37. data/opal/opal/regexp.rb +13 -3
  38. data/opal/opal/runtime.js +134 -51
  39. data/opal/opal/string.rb +45 -22
  40. data/opal/opal/time.rb +25 -7
  41. data/opal/source_map.rb +63 -0
  42. data/opal/source_map/generator.rb +251 -0
  43. data/opal/source_map/parser.rb +102 -0
  44. data/opal/source_map/vlq.rb +122 -0
  45. data/opal/strscan.rb +30 -12
  46. data/spec/opal/class/_inherited_spec.rb +1 -1
  47. data/spec/{rubyspec/core → opal}/class/bridge_class_spec.rb +5 -3
  48. data/spec/{rubyspec/core → opal}/class/extend_spec.rb +0 -0
  49. data/spec/{rubyspec/core → opal}/class/instance_methods_spec.rb +0 -0
  50. data/spec/{rubyspec/core → opal}/class/last_value_spec.rb +0 -1
  51. data/spec/{rubyspec/core → opal}/json/parse_spec.rb +0 -0
  52. data/spec/{rubyspec/core/kernel/block_given.rb → opal/kernel/block_given_spec.rb} +0 -0
  53. data/spec/{rubyspec/core → opal}/kernel/class_spec.rb +0 -0
  54. data/spec/{rubyspec/core → opal}/kernel/extend_spec.rb +0 -0
  55. data/spec/{rubyspec/core → opal}/kernel/format_spec.rb +0 -0
  56. data/spec/opal/kernel/freeze_spec.rb +15 -0
  57. data/spec/{rubyspec/core → opal}/kernel/match_spec.rb +0 -0
  58. data/spec/{rubyspec/core → opal}/kernel/method_spec.rb +0 -0
  59. data/spec/{rubyspec/core → opal}/kernel/methods_spec.rb +0 -0
  60. data/spec/{rubyspec/core → opal}/kernel/nil_spec.rb +0 -0
  61. data/spec/{rubyspec/core → opal}/kernel/p_spec.rb +0 -0
  62. data/spec/{rubyspec/core → opal}/kernel/printf_spec.rb +0 -0
  63. data/spec/{rubyspec/core → opal}/kernel/proc_spec.rb +0 -0
  64. data/spec/{rubyspec/core → opal}/kernel/rand_spec.rb +0 -0
  65. data/spec/{rubyspec/core → opal}/kernel/respond_to_spec.rb +0 -0
  66. data/spec/{rubyspec/core → opal}/kernel/sprintf_spec.rb +0 -0
  67. data/spec/{rubyspec/core → opal}/kernel/to_json_spec.rb +0 -0
  68. data/spec/{rubyspec/core → opal}/module/alias_method_spec.rb +0 -0
  69. data/spec/{rubyspec/core → opal}/module/ancestors_spec.rb +0 -0
  70. data/spec/{rubyspec/core → opal}/module/append_features_spec.rb +0 -0
  71. data/spec/{rubyspec/core → opal}/module/constants_spec.rb +0 -0
  72. data/spec/{rubyspec/core → opal}/module/module_function_spec.rb +0 -1
  73. data/spec/opal/native_spec.rb +85 -3
  74. data/spec/opal/numeric/equal_spec.rb +9 -0
  75. data/spec/opal/parser/irb_spec.rb +43 -0
  76. data/spec/{rubyspec/core → opal}/proc/proc_tricks_spec.rb +0 -0
  77. data/spec/opal/runtime/block_send_spec.rb +28 -0
  78. data/spec/{rubyspec/core/runtime → opal/runtime2}/call_spec.rb +0 -0
  79. data/spec/{rubyspec/core/runtime → opal/runtime2}/class_hierarchy_spec.rb +0 -0
  80. data/spec/{rubyspec/core/runtime → opal/runtime2}/def_spec.rb +0 -0
  81. data/spec/{rubyspec/core/runtime → opal/runtime2}/defined_spec.rb +0 -0
  82. data/spec/{rubyspec/core/runtime → opal/runtime2}/super_spec.rb +0 -0
  83. data/spec/opal/source_map_spec.rb +19 -0
  84. data/spec/opal/string/freeze_spec.rb +15 -0
  85. data/spec/{rubyspec/core → opal}/string/to_json_spec.rb +0 -0
  86. data/spec/ospec/runner.rb +3 -0
  87. data/spec/parser/str_spec.rb +4 -0
  88. data/spec/rubyspec/core/enumerable/fixtures/classes.rb +2 -2
  89. data/spec/rubyspec/core/enumerable/none_spec.rb +68 -0
  90. data/spec/rubyspec/core/enumerable/sort_by_spec.rb +31 -0
  91. data/spec/rubyspec/core/hash/size_spec.rb +1 -1
  92. data/spec/rubyspec/core/hash/to_native_spec.rb +3 -3
  93. data/spec/rubyspec/core/string/fixtures/classes.rb +49 -0
  94. data/spec/rubyspec/core/string/index_spec.rb +405 -0
  95. data/spec/rubyspec/filters/bugs/language/class.rb +0 -2
  96. data/spec/rubyspec/filters/bugs/language/module.rb +3 -0
  97. data/spec/rubyspec/language/array_spec.rb +1 -1
  98. data/spec/rubyspec/language/block_spec.rb +1 -1
  99. data/spec/rubyspec/language/module_spec.rb +5 -5
  100. data/spec/rubyspec/language/predefined_spec.rb +1 -2
  101. data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +29 -0
  102. data/spec/rubyspec/spec_helper.rb +31 -0
  103. metadata +130 -76
  104. data/lib/opal/erb.rb +0 -41
  105. data/opal/erb.rb +0 -19
  106. data/spec/opal/erb/erb_spec.rb +0 -31
  107. data/spec/simple_erb_template.opalerb +0 -1
  108. data/spec/templates/foo/bar.opalerb +0 -1
  109. data/spec/templates/prefixed.opalerb +0 -1
@@ -35,6 +35,10 @@ class Proc
35
35
  def arity
36
36
  `#{self}.length - 1`
37
37
  end
38
+
39
+ def to_n
40
+ self
41
+ end
38
42
  end
39
43
 
40
44
  class Method < Proc; end
@@ -86,4 +86,4 @@ class Range
86
86
  end
87
87
 
88
88
  alias inspect to_s
89
- end
89
+ end
@@ -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
- alias_native :===, :test
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
- alias_native :inspect, :toString
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
@@ -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._klass;
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
- else {
92
- if (!superklass._methods) {
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
- else {
98
- klass = boot_class(superklass, constructor);
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._klass;
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.$included_in = [];
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._klass = constructor;
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._klass = Class;
188
+ constructor.constructor = Class;
188
189
 
189
- constructor['$==='] = module_eqq;
190
- constructor.$to_s = module_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['$call'] = undefined;
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.push(constructor);
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
- constructor.prototype._klass = constructor;
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._klass = Class;
224
+ constructor.constructor = Class;
218
225
  constructor._methods = [];
219
226
  constructor._smethods = [];
220
227
 
221
- constructor['$==='] = module_eqq;
222
- constructor.$to_s = module_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 (var i = 0, length = smethods.length; i < length; i++) {
227
- var m = smethods[i];
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 (var i = 0, length = methods.length; i < length; i++) {
236
- var m = methods[i];
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.$to_native());
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 != null) {
284
- return prop;
316
+ if (prop == null) {
317
+ return nil;
285
318
  }
286
319
 
287
- return nil;
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 != null) {
299
- return prop;
331
+ if (prop == null) {
332
+ return nil;
300
333
  }
301
334
 
302
- return nil;
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._klass._name + '#' : object._name + '.') + meth;
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._klass;
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.$included_in;
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.$included_in) {
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._klass = Object._klass = Class._klass = Class;
557
+ BasicObject.constructor = Object.constructor = Class.constructor = Class;
478
558
 
479
559
 
480
- var bridged_classes = Object.$included_in = [];
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);
@@ -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
- alias_native :downcase, :toLowerCase
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
- alias_native :getbyte, :charCodeAt
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
- alias_native :hash, :toString
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 && !what._isRegexp) {
327
- throw new Error('type mismatch');
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 - offset;
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
- else {
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
- else {
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}._klass === String) {
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
- alias_native :to_s, :toString
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
- alias_native :upcase, :toUpperCase
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 = [];