opal 0.3.20 → 0.3.21

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 (122) hide show
  1. data/.gitignore +2 -7
  2. data/.rspec +2 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +8 -2
  5. data/LICENSE +2 -3
  6. data/README.md +106 -239
  7. data/Rakefile +58 -16
  8. data/bin/opal +1 -0
  9. data/core/array.rb +180 -160
  10. data/core/basic_object.rb +8 -4
  11. data/core/boolean.rb +6 -6
  12. data/core/class.rb +9 -15
  13. data/core/dir.rb +89 -0
  14. data/core/enumerable.rb +83 -86
  15. data/core/error.rb +9 -4
  16. data/core/file.rb +85 -0
  17. data/core/hash.rb +67 -67
  18. data/core/kernel.rb +38 -42
  19. data/core/module.rb +57 -54
  20. data/core/numeric.rb +41 -41
  21. data/core/proc.rb +1 -5
  22. data/core/range.rb +11 -11
  23. data/core/regexp.rb +27 -22
  24. data/core/runtime.js +152 -221
  25. data/core/string.rb +86 -73
  26. data/core/time.rb +22 -18
  27. data/docs/post.html +9 -0
  28. data/docs/pre.html +32 -0
  29. data/lib/opal.rb +43 -3
  30. data/lib/opal/builder.rb +9 -26
  31. data/lib/opal/grammar.rb +1 -1
  32. data/lib/opal/grammar.y +1 -1
  33. data/lib/opal/lexer.rb +21 -15
  34. data/lib/opal/parser.rb +100 -111
  35. data/lib/opal/rake_task.rb +66 -0
  36. data/lib/opal/scope.rb +13 -5
  37. data/lib/opal/version.rb +1 -1
  38. data/opal.gemspec +2 -0
  39. data/spec/browser_spec.rb +28 -0
  40. data/spec/builder/lib_name_for_spec.rb +1 -6
  41. data/spec/grammar/alias_spec.rb +1 -1
  42. data/spec/grammar/and_spec.rb +1 -1
  43. data/spec/grammar/array_spec.rb +1 -1
  44. data/spec/grammar/attrasgn_spec.rb +1 -1
  45. data/spec/grammar/begin_spec.rb +1 -1
  46. data/spec/grammar/block_spec.rb +1 -1
  47. data/spec/grammar/break_spec.rb +1 -1
  48. data/spec/grammar/call_spec.rb +1 -1
  49. data/spec/grammar/class_spec.rb +1 -1
  50. data/spec/grammar/const_spec.rb +1 -1
  51. data/spec/grammar/cvar_spec.rb +1 -1
  52. data/spec/grammar/def_spec.rb +1 -1
  53. data/spec/grammar/false_spec.rb +1 -1
  54. data/spec/grammar/file_spec.rb +1 -1
  55. data/spec/grammar/gvar_spec.rb +1 -1
  56. data/spec/grammar/hash_spec.rb +1 -1
  57. data/spec/grammar/iasgn_spec.rb +1 -1
  58. data/spec/grammar/if_spec.rb +1 -1
  59. data/spec/grammar/iter_spec.rb +1 -1
  60. data/spec/grammar/ivar_spec.rb +1 -1
  61. data/spec/grammar/lambda_spec.rb +1 -1
  62. data/spec/grammar/lasgn_spec.rb +1 -1
  63. data/spec/grammar/line_spec.rb +1 -1
  64. data/spec/grammar/lvar_spec.rb +1 -1
  65. data/spec/grammar/masgn_spec.rb +1 -1
  66. data/spec/grammar/module_spec.rb +1 -1
  67. data/spec/grammar/nil_spec.rb +1 -1
  68. data/spec/grammar/not_spec.rb +1 -1
  69. data/spec/grammar/op_asgn1_spec.rb +1 -1
  70. data/spec/grammar/op_asgn2_spec.rb +1 -1
  71. data/spec/grammar/or_spec.rb +1 -1
  72. data/spec/grammar/return_spec.rb +1 -1
  73. data/spec/grammar/sclass_spec.rb +1 -1
  74. data/spec/grammar/self_spec.rb +1 -1
  75. data/spec/grammar/str_spec.rb +1 -1
  76. data/spec/grammar/super_spec.rb +1 -1
  77. data/spec/grammar/true_spec.rb +1 -1
  78. data/spec/grammar/undef_spec.rb +1 -1
  79. data/spec/grammar/unless_spec.rb +1 -1
  80. data/spec/grammar/while_spec.rb +1 -1
  81. data/spec/grammar/xstr_spec.rb +1 -1
  82. data/spec/grammar/yield_spec.rb +1 -1
  83. data/spec/spec_helper.rb +6 -1
  84. data/test/core/array/minus_spec.rb +13 -0
  85. data/test/core/enumerable/drop_while_spec.rb +0 -5
  86. data/test/core/range/case_compare_spec.rb +0 -1
  87. data/test/index.html +1 -1
  88. data/test/index.min.html +12 -0
  89. data/test/language/alias_spec.rb +0 -4
  90. data/test/language/fixtures/next.rb +62 -0
  91. data/test/language/metaclass_spec.rb +4 -4
  92. data/test/language/next_spec.rb +0 -63
  93. data/test/language/send_spec.rb +0 -5
  94. data/test/language/singleton_class_spec.rb +4 -0
  95. data/test/opal/array/subclassing_spec.rb +1 -1
  96. data/test/opal/class/bridge_class_spec.rb +2 -2
  97. data/test/opal/runtime/class_hierarchy_spec.rb +1 -2
  98. data/test/opal/runtime/method_missing_spec.rb +17 -0
  99. data/test/spec_helper.rb +4 -1
  100. metadata +32 -28
  101. data/docs/CNAME +0 -1
  102. data/docs/Rakefile +0 -55
  103. data/docs/css/styles.css +0 -50
  104. data/docs/css/syntax.css +0 -63
  105. data/docs/layout/post.html +0 -3
  106. data/docs/layout/pre.html +0 -11
  107. data/examples/dependencies/.gitignore +0 -1
  108. data/examples/dependencies/Gemfile +0 -6
  109. data/examples/dependencies/README.md +0 -41
  110. data/examples/dependencies/Rakefile +0 -10
  111. data/examples/dependencies/app.rb +0 -19
  112. data/examples/dependencies/build/.gitkeep +0 -0
  113. data/examples/dependencies/index.html +0 -13
  114. data/examples/hello_world/.gitignore +0 -1
  115. data/examples/hello_world/Gemfile +0 -3
  116. data/examples/hello_world/README.md +0 -27
  117. data/examples/hello_world/Rakefile +0 -23
  118. data/examples/hello_world/app.rb +0 -7
  119. data/examples/hello_world/index.html +0 -12
  120. data/lib/opal/builder_task.rb +0 -91
  121. data/spec/builder/build_order_spec.rb +0 -20
  122. data/test/opal/runtime/_methods_spec.rb +0 -48
@@ -1,7 +1,5 @@
1
1
  class String < `String`
2
- %x{
3
- String_prototype._isString = true;
4
- }
2
+ `String.prototype._isString = true`
5
3
 
6
4
  include Comparable
7
5
 
@@ -12,7 +10,12 @@ class String < `String`
12
10
  end
13
11
 
14
12
  def self.new(str = '')
15
- allocate str.to_s
13
+ %x{
14
+ var s = new String(#{str.to_s});
15
+ s.$m = #{self}.$m_tbl;
16
+ s.$k = #{self};
17
+ return s;
18
+ }
16
19
  end
17
20
 
18
21
  def %(data)
@@ -26,7 +29,7 @@ class String < `String`
26
29
  }
27
30
 
28
31
  var result = '',
29
- pattern = this.valueOf();
32
+ pattern = #{self}.valueOf();
30
33
 
31
34
  while (count > 0) {
32
35
  if (count & 1) {
@@ -41,7 +44,7 @@ class String < `String`
41
44
  end
42
45
 
43
46
  def +(other)
44
- `this + other`
47
+ `#{self}.toString() + other`
45
48
  end
46
49
 
47
50
  def <=>(other)
@@ -50,28 +53,28 @@ class String < `String`
50
53
  return nil;
51
54
  }
52
55
 
53
- return this > other ? 1 : (this < other ? -1 : 0);
56
+ return #{self} > other ? 1 : (#{self} < other ? -1 : 0);
54
57
  }
55
58
  end
56
59
 
57
60
  def <(other)
58
- `this < other`
61
+ `#{self} < other`
59
62
  end
60
63
 
61
64
  def <=(other)
62
- `this <= other`
65
+ `#{self} <= other`
63
66
  end
64
67
 
65
68
  def >(other)
66
- `this > other`
69
+ `#{self} > other`
67
70
  end
68
71
 
69
72
  def >=(other)
70
- `this >= other`
73
+ `#{self} >= other`
71
74
  end
72
75
 
73
76
  def ==(other)
74
- `this == other`
77
+ `#{self} == other`
75
78
  end
76
79
 
77
80
  alias === ==
@@ -91,30 +94,30 @@ class String < `String`
91
94
  %x{
92
95
  if (length == null) {
93
96
  if (index < 0) {
94
- index += this.length;
97
+ index += #{self}.length;
95
98
  }
96
99
 
97
- if (index >= this.length || index < 0) {
100
+ if (index >= #{self}.length || index < 0) {
98
101
  return nil;
99
102
  }
100
103
 
101
- return this.substr(index, 1);
104
+ return #{self}.substr(index, 1);
102
105
  }
103
106
 
104
107
  if (index < 0) {
105
- index += this.length + 1;
108
+ index += #{self}.length + 1;
106
109
  }
107
110
 
108
- if (index > this.length || index < 0) {
111
+ if (index > #{self}.length || index < 0) {
109
112
  return nil;
110
113
  }
111
114
 
112
- return this.substr(index, length);
115
+ return #{self}.substr(index, length);
113
116
  }
114
117
  end
115
118
 
116
119
  def capitalize
117
- `this.charAt(0).toUpperCase() + this.substr(1).toLowerCase()`
120
+ `#{self}.charAt(0).toUpperCase() + #{self}.substr(1).toLowerCase()`
118
121
  end
119
122
 
120
123
  def casecmp(other)
@@ -123,7 +126,7 @@ class String < `String`
123
126
  return other;
124
127
  }
125
128
 
126
- var a = this.toLowerCase(),
129
+ var a = #{self}.toLowerCase(),
127
130
  b = other.toLowerCase();
128
131
 
129
132
  return a > b ? 1 : (a < b ? -1 : 0);
@@ -134,8 +137,8 @@ class String < `String`
134
137
  return enum_for :chars unless block_given?
135
138
 
136
139
  %x{
137
- for (var i = 0, length = this.length; i < length; i++) {
138
- #{yield `this.charAt(i)`}
140
+ for (var i = 0, length = #{self}.length; i < length; i++) {
141
+ #{yield `#{self}.charAt(i)`}
139
142
  }
140
143
  }
141
144
  end
@@ -143,24 +146,26 @@ class String < `String`
143
146
  def chomp(separator = $/)
144
147
  %x{
145
148
  if (separator === "\\n") {
146
- return this.replace(/(\\n|\\r|\\r\\n)$/, '');
149
+ return #{self}.replace(/(\\n|\\r|\\r\\n)$/, '');
147
150
  }
148
151
  else if (separator === "") {
149
- return this.replace(/(\\n|\\r\\n)+$/, '');
152
+ return #{self}.replace(/(\\n|\\r\\n)+$/, '');
150
153
  }
151
- return this.replace(new RegExp(separator + '$'), '');
154
+ return #{self}.replace(new RegExp(separator + '$'), '');
152
155
  }
153
156
  end
154
157
 
155
158
  def chop
156
- `this.substr(0, this.length - 1)`
159
+ `#{self}.substr(0, #{self}.length - 1)`
157
160
  end
158
161
 
159
162
  def chr
160
- `this.charAt(0)`
163
+ `#{self}.charAt(0)`
161
164
  end
162
165
 
163
- alias_native :downcase, :toLowerCase
166
+ def downcase
167
+ `#{self}.toLowerCase()`
168
+ end
164
169
 
165
170
  alias each_char chars
166
171
 
@@ -168,7 +173,7 @@ class String < `String`
168
173
  return enum_for :each_line, separator unless block_given?
169
174
 
170
175
  %x{
171
- var splitted = this.split(separator);
176
+ var splitted = #{self}.split(separator);
172
177
 
173
178
  for (var i = 0, length = splitted.length; i < length; i++) {
174
179
  #{yield `splitted[i] + separator`}
@@ -177,7 +182,7 @@ class String < `String`
177
182
  end
178
183
 
179
184
  def empty?
180
- `this.length === 0`
185
+ `#{self}.length === 0`
181
186
  end
182
187
 
183
188
  def end_with?(*suffixes)
@@ -185,7 +190,7 @@ class String < `String`
185
190
  for (var i = 0, length = suffixes.length; i < length; i++) {
186
191
  var suffix = suffixes[i];
187
192
 
188
- if (this.lastIndexOf(suffix) === this.length - suffix.length) {
193
+ if (#{self}.lastIndexOf(suffix) === #{self}.length - suffix.length) {
189
194
  return true;
190
195
  }
191
196
  }
@@ -197,10 +202,12 @@ class String < `String`
197
202
  alias eql? ==
198
203
 
199
204
  def equal?(val)
200
- `this.toString() === val.toString()`
205
+ `#{self}.toString() === val.toString()`
201
206
  end
202
207
 
203
- alias_native :getbyte, :charCodeAt
208
+ def getbyte(idx)
209
+ `#{self}.charCodeAt(idx)`
210
+ end
204
211
 
205
212
  def gsub(pattern, replace, &block)
206
213
  return enum_for :gsub, pattern, replace if !block && `pattern == null`
@@ -218,14 +225,16 @@ class String < `String`
218
225
  }
219
226
  end
220
227
 
221
- alias_native :hash, :toString
228
+ def hash
229
+ `#{self}.toString()`
230
+ end
222
231
 
223
232
  def hex
224
233
  to_i 16
225
234
  end
226
235
 
227
236
  def include?(other)
228
- `this.indexOf(other) !== -1`
237
+ `#{self}.indexOf(other) !== -1`
229
238
  end
230
239
 
231
240
  def index(what, offset)
@@ -238,14 +247,14 @@ class String < `String`
238
247
 
239
248
  if (offset != null) {
240
249
  if (offset < 0) {
241
- offset = this.length - offset;
250
+ offset = #{self}.length - offset;
242
251
  }
243
252
 
244
253
  if (#{what.is_a?(Regexp)}) {
245
- result = #{what =~ `this.substr(offset)` || -1}
254
+ result = #{what =~ `#{self}.substr(offset)` || -1}
246
255
  }
247
256
  else {
248
- result = this.substr(offset).indexOf(substr);
257
+ result = #{self}.substr(offset).indexOf(substr);
249
258
  }
250
259
 
251
260
  if (result !== -1) {
@@ -257,7 +266,7 @@ class String < `String`
257
266
  result = #{(what =~ self) || -1}
258
267
  }
259
268
  else {
260
- result = this.indexOf(substr);
269
+ result = #{self}.indexOf(substr);
261
270
  }
262
271
  }
263
272
 
@@ -280,12 +289,12 @@ class String < `String`
280
289
 
281
290
  escapable.lastIndex = 0;
282
291
 
283
- return escapable.test(this) ? '"' + this.replace(escapable, function(a) {
292
+ return escapable.test(#{self}) ? '"' + #{self}.replace(escapable, function(a) {
284
293
  var c = meta[a];
285
294
 
286
295
  return typeof c === 'string' ? c :
287
296
  '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
288
- }) + '"' : '"' + this + '"';
297
+ }) + '"' : '"' + #{self} + '"';
289
298
  }
290
299
  end
291
300
 
@@ -296,7 +305,7 @@ class String < `String`
296
305
  alias lines each_line
297
306
 
298
307
  def length
299
- `this.length`
308
+ `#{self}.length`
300
309
  end
301
310
 
302
311
  def ljust(integer, padstr = ' ')
@@ -304,7 +313,7 @@ class String < `String`
304
313
  end
305
314
 
306
315
  def lstrip
307
- `this.replace(/^\\s*/, '')`
316
+ `#{self}.replace(/^\\s*/, '')`
308
317
  end
309
318
 
310
319
  def match(pattern, pos, &block)
@@ -313,36 +322,36 @@ class String < `String`
313
322
 
314
323
  def next
315
324
  %x{
316
- if (this.length === 0) {
325
+ if (#{self}.length === 0) {
317
326
  return "";
318
327
  }
319
328
 
320
- var initial = this.substr(0, this.length - 1);
321
- var last = String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
329
+ var initial = #{self}.substr(0, #{self}.length - 1);
330
+ var last = String.fromCharCode(#{self}.charCodeAt(#{self}.length - 1) + 1);
322
331
 
323
332
  return initial + last;
324
333
  }
325
334
  end
326
335
 
327
336
  def ord
328
- `this.charCodeAt(0)`
337
+ `#{self}.charCodeAt(0)`
329
338
  end
330
339
 
331
340
  def partition(str)
332
341
  %x{
333
- var result = this.split(str);
334
- var splitter = (result[0].length === this.length ? "" : str);
342
+ var result = #{self}.split(str);
343
+ var splitter = (result[0].length === #{self}.length ? "" : str);
335
344
 
336
345
  return [result[0], splitter, result.slice(1).join(str.toString())];
337
346
  }
338
347
  end
339
348
 
340
349
  def reverse
341
- `this.split('').reverse().join('')`
350
+ `#{self}.split('').reverse().join('')`
342
351
  end
343
352
 
344
353
  def rstrip
345
- `this.replace(/\\s*$/, '')`
354
+ `#{self}.replace(/\\s*$/, '')`
346
355
  end
347
356
 
348
357
  alias size length
@@ -350,13 +359,13 @@ class String < `String`
350
359
  alias slice []
351
360
 
352
361
  def split(pattern = $; || ' ', limit = undefined)
353
- `this.split(pattern, limit)`
362
+ `#{self}.split(pattern, limit)`
354
363
  end
355
364
 
356
365
  def start_with?(*prefixes)
357
366
  %x{
358
367
  for (var i = 0, length = prefixes.length; i < length; i++) {
359
- if (this.indexOf(prefixes[i]) === 0) {
368
+ if (#{self}.indexOf(prefixes[i]) === 0) {
360
369
  return true;
361
370
  }
362
371
  }
@@ -366,22 +375,22 @@ class String < `String`
366
375
  end
367
376
 
368
377
  def strip
369
- `this.replace(/^\\s*/, '').replace(/\\s*$/, '')`
378
+ `#{self}.replace(/^\\s*/, '').replace(/\\s*$/, '')`
370
379
  end
371
380
 
372
381
  def sub(pattern, replace, &block)
373
382
  %x{
374
383
  if (typeof(replace) === 'string') {
375
- return this.replace(pattern, replace);
384
+ return #{self}.replace(pattern, replace);
376
385
  }
377
386
  if (block !== nil) {
378
- return this.replace(pattern, function(str) {
379
- return block.call(__context, str);
387
+ return #{self}.replace(pattern, function(str) {
388
+ return block(__context, str);
380
389
  });
381
390
  }
382
391
  else if (replace != null) {
383
392
  if (#{replace.is_a?(Hash)}) {
384
- return this.replace(pattern, function(str) {
393
+ return #{self}.replace(pattern, function(str) {
385
394
  var value = #{replace[str]};
386
395
 
387
396
  return (value == null) ? nil : #{value.to_s};
@@ -394,11 +403,11 @@ class String < `String`
394
403
  #{raise TypeError, "can't convert #{replace.class} into String"};
395
404
  }
396
405
 
397
- return this.replace(pattern, replace);
406
+ return #{self}.replace(pattern, replace);
398
407
  }
399
408
  }
400
409
  else {
401
- return this.replace(pattern, replace.toString());
410
+ return #{self}.replace(pattern, replace.toString());
402
411
  }
403
412
  }
404
413
  end
@@ -409,8 +418,8 @@ class String < `String`
409
418
  %x{
410
419
  var result = 0;
411
420
 
412
- for (var i = 0, length = this.length; i < length; i++) {
413
- result += (this.charCodeAt(i) % ((1 << n) - 1));
421
+ for (var i = 0, length = #{self}.length; i < length; i++) {
422
+ result += (#{self}.charCodeAt(i) % ((1 << n) - 1));
414
423
  }
415
424
 
416
425
  return result;
@@ -419,31 +428,31 @@ class String < `String`
419
428
 
420
429
  def swapcase
421
430
  %x{
422
- var str = this.replace(/([a-z]+)|([A-Z]+)/g, function($0,$1,$2) {
431
+ var str = #{self}.replace(/([a-z]+)|([A-Z]+)/g, function($0,$1,$2) {
423
432
  return $1 ? $0.toUpperCase() : $0.toLowerCase();
424
433
  });
425
434
 
426
- if (this._klass === String) {
435
+ if (#{self}.$k === String) {
427
436
  return str;
428
437
  }
429
438
 
430
- return this._klass.$new(str);
439
+ return #{self.class.new `str`};
431
440
  }
432
441
  end
433
442
 
434
443
  def to_a
435
444
  %x{
436
- if (this.length === 0) {
445
+ if (#{self}.length === 0) {
437
446
  return [];
438
447
  }
439
448
 
440
- return [this];
449
+ return [#{self}];
441
450
  }
442
451
  end
443
452
 
444
453
  def to_f
445
454
  %x{
446
- var result = parseFloat(this);
455
+ var result = parseFloat(#{self});
447
456
 
448
457
  return isNaN(result) ? 0 : result;
449
458
  }
@@ -451,7 +460,7 @@ class String < `String`
451
460
 
452
461
  def to_i(base = 10)
453
462
  %x{
454
- var result = parseInt(this, base);
463
+ var result = parseInt(#{self}, base);
455
464
 
456
465
  if (isNaN(result)) {
457
466
  return 0;
@@ -465,19 +474,23 @@ class String < `String`
465
474
 
466
475
  def to_proc
467
476
  %x{
468
- var self = this, jsid = mid_to_jsid(self);
477
+ var name = #{self};
469
478
 
470
- return function(arg) { return arg[jsid](); };
479
+ return function(s, arg) { return arg.$m[name](arg); };
471
480
  }
472
481
  end
473
482
 
474
- alias_native :to_s, :toString
483
+ def to_s
484
+ `#{self}.toString()`
485
+ end
475
486
 
476
487
  alias to_str to_s
477
488
 
478
489
  alias to_sym intern
479
490
 
480
- alias_native :upcase, :toUpperCase
491
+ def upcase
492
+ `#{self}.toUpperCase()`
493
+ end
481
494
  end
482
495
 
483
496
  Symbol = String