opal 0.3.20 → 0.3.21

Sign up to get free protection for your applications and to get access to all the features.
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