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
data/Rakefile CHANGED
@@ -4,18 +4,21 @@ Bundler.setup
4
4
 
5
5
  require 'opal'
6
6
  require 'opal/version'
7
+ require 'opal/rake_task'
7
8
 
8
- Opal::BuilderTask.new do |t|
9
- t.name = 'opal'
10
- t.files = []
11
- t.dependencies = %w[opal-spec opal-dom]
9
+ Opal::RakeTask.new do |t|
10
+ t.dependencies = %w(opal-spec opal-dom)
12
11
  t.specs_dir = 'test'
12
+ t.files = [] # we handle this by Opal.runtime instead
13
13
  end
14
14
 
15
- desc "Build opal.js runtime into ./build"
16
- task :build do
17
- File.open('build/opal.js', 'w+') do |o|
18
- o.write Opal::Builder.runtime
15
+ desc "Build minified runtime, dependencies and specs"
16
+ task :min => :opal do
17
+ %w(opal opal-dom opal-spec specs).each do |f|
18
+ File.open("build/#{f}.min.js", 'w+') do |o|
19
+ puts " * build/#{f}.min.js"
20
+ o.write uglify(File.read "build/#{f}.js")
21
+ end
19
22
  end
20
23
  end
21
24
 
@@ -52,15 +55,54 @@ def gzip(str)
52
55
  end
53
56
  end
54
57
 
55
- # Rubygems
56
- namespace :gem do
57
- desc "Build opal-#{Opal::VERSION}.gem"
58
+ # Test
59
+ require 'rspec/core/rake_task'
60
+ RSpec::Core::RakeTask.new :default
61
+
62
+ namespace :docs do
63
+ desc "Clone repo"
64
+ task :clone do
65
+ if File.exists? 'gh-pages'
66
+ Dir.chdir('gh-pages') { sh 'git pull origin gh-pages' }
67
+ else
68
+ FileUtils.mkdir_p 'gh-pages'
69
+ Dir.chdir('gh-pages') do
70
+ sh 'git clone git@github.com:/adambeynon/opal.git .'
71
+ sh 'git checkout gh-pages'
72
+ end
73
+ end
74
+ end
75
+
76
+ desc "Build README.md => index.html"
58
77
  task :build do
59
- sh "gem build opal.gemspec"
78
+ require 'redcarpet'
79
+ require 'albino'
80
+
81
+ klass = Class.new(Redcarpet::Render::HTML) do
82
+ def block_code(code, language)
83
+ Albino.new(code, language || :text).colorize
84
+ end
85
+ end
86
+
87
+ puts 'gh-pages/index.html'
88
+ markdown = Redcarpet::Markdown.new(klass, :fenced_code_blocks => true)
89
+
90
+ File.open('gh-pages/index.html', 'w+') do |o|
91
+ o.write File.read('docs/pre.html')
92
+ o.write markdown.render(File.read "README.md")
93
+ o.write File.read('docs/post.html')
94
+ end
95
+
96
+ puts "gh-pages/opal.js"
97
+ FileUtils.cp 'build/opal.js', 'gh-pages/opal.js'
60
98
  end
61
99
 
62
- desc "Release opal-#{Opal::VERSION}.gem"
63
- task :release do
64
- puts "Need to release opal-#{Opal::VERSION}.gem"
100
+ desc "commit and push"
101
+ task :push do
102
+ Dir.chdir('gh-pages') do
103
+ sh "git add ."
104
+ sh "git commit -a -m \"Documentation update #{Time.new}\""
105
+ sh "git push origin gh-pages"
106
+ end
65
107
  end
66
- end
108
+ end
data/bin/opal CHANGED
@@ -6,6 +6,7 @@ first = ARGV.first
6
6
 
7
7
  if first.nil?
8
8
  puts "Usage: opal path/to/file.rb"
9
+ puts 'Usage: opal "code to compile"'
9
10
  elsif first == '-v' or first == '--version'
10
11
  puts Opal::VERSION
11
12
  elsif File.exist? first
@@ -1,7 +1,6 @@
1
+ `Array.prototype._isArray = true`
2
+
1
3
  class Array < `Array`
2
- %x{
3
- Array_prototype._isArray = true;
4
- }
5
4
 
6
5
  include Enumerable
7
6
 
@@ -15,8 +14,25 @@ class Array < `Array`
15
14
  }
16
15
  end
17
16
 
18
- def self.new(*a)
19
- allocate
17
+ def self.allocate
18
+ %x{
19
+ var arr = [];
20
+ arr.$k = #{self};
21
+ arr.$m = #{self}.$m_tbl;
22
+ return arr;
23
+ }
24
+ end
25
+
26
+ def self.new(size, obj = nil)
27
+ arr = allocate
28
+
29
+ %x{
30
+ for (var i = 0; i < size; i++) {
31
+ arr[i] = obj;
32
+ }
33
+ }
34
+
35
+ arr
20
36
  end
21
37
 
22
38
  def &(other)
@@ -24,8 +40,8 @@ class Array < `Array`
24
40
  var result = [],
25
41
  seen = {};
26
42
 
27
- for (var i = 0, length = this.length; i < length; i++) {
28
- var item = this[i];
43
+ for (var i = 0, length = #{self}.length; i < length; i++) {
44
+ var item = #{self}[i];
29
45
 
30
46
  if (!seen[item]) {
31
47
  for (var j = 0, length2 = other.length; j < length2; j++) {
@@ -47,13 +63,13 @@ class Array < `Array`
47
63
  def *(other)
48
64
  %x{
49
65
  if (typeof(other) === 'string') {
50
- return this.join(other);
66
+ return #{self}.join(other);
51
67
  }
52
68
 
53
69
  var result = [];
54
70
 
55
- for (var i = 0, length = this.length; i < length; i++) {
56
- result = result.concat(this);
71
+ for (var i = 0, length = #{self}.length; i < length; i++) {
72
+ result = result.concat(#{self});
57
73
  }
58
74
 
59
75
  return result;
@@ -61,11 +77,15 @@ class Array < `Array`
61
77
  end
62
78
 
63
79
  def +(other)
64
- `this.slice().concat(other.slice())`
80
+ `#{self}.slice().concat(other.slice())`
81
+ end
82
+
83
+ def -(other)
84
+ reject { |i| other.include? i }
65
85
  end
66
86
 
67
87
  def <<(object)
68
- `this.push(object);`
88
+ `#{self}.push(object);`
69
89
 
70
90
  self
71
91
  end
@@ -76,12 +96,12 @@ class Array < `Array`
76
96
  return 0;
77
97
  }
78
98
 
79
- if (this.length != other.length) {
80
- return (this.length > other.length) ? 1 : -1;
99
+ if (#{self}.length != other.length) {
100
+ return (#{self}.length > other.length) ? 1 : -1;
81
101
  }
82
102
 
83
- for (var i = 0, length = this.length, tmp; i < length; i++) {
84
- if ((tmp = #{`this[i]` <=> `other[i]`}) !== 0) {
103
+ for (var i = 0, length = #{self}.length, tmp; i < length; i++) {
104
+ if ((tmp = #{`#{self}[i]` <=> `other[i]`}) !== 0) {
85
105
  return tmp;
86
106
  }
87
107
  }
@@ -92,12 +112,12 @@ class Array < `Array`
92
112
 
93
113
  def ==(other)
94
114
  %x{
95
- if (!other || (this.length !== other.length)) {
115
+ if (!other || (#{self}.length !== other.length)) {
96
116
  return false;
97
117
  }
98
118
 
99
- for (var i = 0, length = this.length; i < length; i++) {
100
- if (!#{`this[i]` == `other[i]`}) {
119
+ for (var i = 0, length = #{self}.length; i < length; i++) {
120
+ if (!#{`#{self}[i]` == `other[i]`}) {
101
121
  return false;
102
122
  }
103
123
  }
@@ -109,7 +129,7 @@ class Array < `Array`
109
129
  # TODO: does not yet work with ranges
110
130
  def [](index, length = undefined)
111
131
  %x{
112
- var size = this.length;
132
+ var size = #{self}.length;
113
133
 
114
134
  if (typeof index !== 'number') {
115
135
  if (index._isRange) {
@@ -126,7 +146,7 @@ class Array < `Array`
126
146
  }
127
147
 
128
148
  if (!exclude) length += 1;
129
- return this.slice(index, length);
149
+ return #{self}.slice(index, length);
130
150
  }
131
151
  else {
132
152
  #{ raise "bad arg for Array#[]" };
@@ -142,14 +162,14 @@ class Array < `Array`
142
162
  return nil;
143
163
  }
144
164
 
145
- return this.slice(index, index + length);
165
+ return #{self}.slice(index, index + length);
146
166
  }
147
167
  else {
148
168
  if (index >= size || index < 0) {
149
169
  return nil;
150
170
  }
151
171
 
152
- return this[index];
172
+ return #{self}[index];
153
173
  }
154
174
  }
155
175
  end
@@ -157,20 +177,20 @@ class Array < `Array`
157
177
  # TODO: need to expand functionality
158
178
  def []=(index, value)
159
179
  %x{
160
- var size = this.length;
180
+ var size = #{self}.length;
161
181
 
162
182
  if (index < 0) {
163
183
  index += size;
164
184
  }
165
185
 
166
- return this[index] = value;
186
+ return #{self}[index] = value;
167
187
  }
168
188
  end
169
189
 
170
190
  def assoc(object)
171
191
  %x{
172
- for (var i = 0, length = this.length, item; i < length; i++) {
173
- if (item = this[i], item.length && #{`item[0]` == object}) {
192
+ for (var i = 0, length = #{self}.length, item; i < length; i++) {
193
+ if (item = #{self}[i], item.length && #{`item[0]` == object}) {
174
194
  return item;
175
195
  }
176
196
  }
@@ -182,25 +202,25 @@ class Array < `Array`
182
202
  def at(index)
183
203
  %x{
184
204
  if (index < 0) {
185
- index += this.length;
205
+ index += #{self}.length;
186
206
  }
187
207
 
188
- if (index < 0 || index >= this.length) {
208
+ if (index < 0 || index >= #{self}.length) {
189
209
  return nil;
190
210
  }
191
211
 
192
- return this[index];
212
+ return #{self}[index];
193
213
  }
194
214
  end
195
215
 
196
216
  def clear
197
- `this.splice(0);`
217
+ `#{self}.splice(0);`
198
218
 
199
219
  self
200
220
  end
201
221
 
202
222
  def clone
203
- `this.slice()`
223
+ `#{self}.slice()`
204
224
  end
205
225
 
206
226
  def collect(&block)
@@ -209,8 +229,8 @@ class Array < `Array`
209
229
  %x{
210
230
  var result = [];
211
231
 
212
- for (var i = 0, length = this.length, value; i < length; i++) {
213
- if ((value = block.call(__context, this[i])) === __breaker) {
232
+ for (var i = 0, length = #{self}.length, value; i < length; i++) {
233
+ if ((value = block(__context, #{self}[i])) === __breaker) {
214
234
  return __breaker.$v;
215
235
  }
216
236
 
@@ -225,12 +245,12 @@ class Array < `Array`
225
245
  return enum_for :collect! unless block_given?
226
246
 
227
247
  %x{
228
- for (var i = 0, length = this.length, val; i < length; i++) {
229
- if ((val = block.call(__context, this[i])) === __breaker) {
248
+ for (var i = 0, length = #{self}.length, val; i < length; i++) {
249
+ if ((val = block(__context, #{self}[i])) === __breaker) {
230
250
  return __breaker.$v;
231
251
  }
232
252
 
233
- this[i] = val;
253
+ #{self}[i] = val;
234
254
  }
235
255
  }
236
256
 
@@ -241,8 +261,8 @@ class Array < `Array`
241
261
  %x{
242
262
  var result = [];
243
263
 
244
- for (var i = 0, length = this.length, item; i < length; i++) {
245
- if ((item = this[i]) !== nil) {
264
+ for (var i = 0, length = #{self}.length, item; i < length; i++) {
265
+ if ((item = #{self}[i]) !== nil) {
246
266
  result.push(item);
247
267
  }
248
268
  }
@@ -253,25 +273,25 @@ class Array < `Array`
253
273
 
254
274
  def compact!
255
275
  %x{
256
- var original = this.length;
276
+ var original = #{self}.length;
257
277
 
258
- for (var i = 0, length = this.length; i < length; i++) {
259
- if (this[i] === nil) {
260
- this.splice(i, 1);
278
+ for (var i = 0, length = #{self}.length; i < length; i++) {
279
+ if (#{self}[i] === nil) {
280
+ #{self}.splice(i, 1);
261
281
 
262
282
  length--;
263
283
  i--;
264
284
  }
265
285
  }
266
286
 
267
- return this.length === original ? nil : this;
287
+ return #{self}.length === original ? nil : #{self};
268
288
  }
269
289
  end
270
290
 
271
291
  def concat(other)
272
292
  %x{
273
293
  for (var i = 0, length = other.length; i < length; i++) {
274
- this.push(other[i]);
294
+ #{self}.push(other[i]);
275
295
  }
276
296
  }
277
297
 
@@ -281,13 +301,13 @@ class Array < `Array`
281
301
  def count(object)
282
302
  %x{
283
303
  if (object == null) {
284
- return this.length;
304
+ return #{self}.length;
285
305
  }
286
306
 
287
307
  var result = 0;
288
308
 
289
- for (var i = 0, length = this.length; i < length; i++) {
290
- if (#{`this[i]` == object}) {
309
+ for (var i = 0, length = #{self}.length; i < length; i++) {
310
+ if (#{`#{self}[i]` == object}) {
291
311
  result++;
292
312
  }
293
313
  }
@@ -298,34 +318,34 @@ class Array < `Array`
298
318
 
299
319
  def delete(object)
300
320
  %x{
301
- var original = this.length;
321
+ var original = #{self}.length;
302
322
 
303
323
  for (var i = 0, length = original; i < length; i++) {
304
- if (#{`this[i]` == object}) {
305
- this.splice(i, 1);
324
+ if (#{`#{self}[i]` == object}) {
325
+ #{self}.splice(i, 1);
306
326
 
307
327
  length--;
308
328
  i--;
309
329
  }
310
330
  }
311
331
 
312
- return this.length === original ? nil : object;
332
+ return #{self}.length === original ? nil : object;
313
333
  }
314
334
  end
315
335
 
316
336
  def delete_at(index)
317
337
  %x{
318
338
  if (index < 0) {
319
- index += this.length;
339
+ index += #{self}.length;
320
340
  }
321
341
 
322
- if (index < 0 || index >= this.length) {
342
+ if (index < 0 || index >= #{self}.length) {
323
343
  return nil;
324
344
  }
325
345
 
326
- var result = this[index];
346
+ var result = #{self}[index];
327
347
 
328
- this.splice(index, 1);
348
+ #{self}.splice(index, 1);
329
349
 
330
350
  return result;
331
351
  }
@@ -335,13 +355,13 @@ class Array < `Array`
335
355
  return enum_for :delete_if unless block_given?
336
356
 
337
357
  %x{
338
- for (var i = 0, length = this.length, value; i < length; i++) {
339
- if ((value = block.call(__context, this[i])) === __breaker) {
358
+ for (var i = 0, length = #{self}.length, value; i < length; i++) {
359
+ if ((value = block(__context, #{self}[i])) === __breaker) {
340
360
  return __breaker.$v;
341
361
  }
342
362
 
343
363
  if (value !== false && value !== nil) {
344
- this.splice(i, 1);
364
+ #{self}.splice(i, 1);
345
365
 
346
366
  length--;
347
367
  i--;
@@ -353,20 +373,20 @@ class Array < `Array`
353
373
  end
354
374
 
355
375
  def drop(number)
356
- `this.slice(number)`
376
+ `#{self}.slice(number)`
357
377
  end
358
378
 
359
379
  def drop_while(&block)
360
380
  return enum_for :drop_while unless block_given?
361
381
 
362
382
  %x{
363
- for (var i = 0, length = this.length, value; i < length; i++) {
364
- if ((value = block.call(__context, this[i])) === __breaker) {
383
+ for (var i = 0, length = #{self}.length, value; i < length; i++) {
384
+ if ((value = block.call(__context, #{self}[i])) === __breaker) {
365
385
  return __breaker.$v;
366
386
  }
367
387
 
368
388
  if (value === false || value === nil) {
369
- return this.slice(i);
389
+ return #{self}.slice(i);
370
390
  }
371
391
  }
372
392
 
@@ -379,8 +399,8 @@ class Array < `Array`
379
399
  def each(&block)
380
400
  return enum_for :each unless block_given?
381
401
 
382
- `for (var i = 0, length = this.length; i < length; i++) {`
383
- yield `this[i]`
402
+ `for (var i = 0, length = #{self}.length; i < length; i++) {`
403
+ yield `#{self}[i]`
384
404
  `}`
385
405
 
386
406
  self
@@ -389,7 +409,7 @@ class Array < `Array`
389
409
  def each_index(&block)
390
410
  return enum_for :each_index unless block_given?
391
411
 
392
- `for (var i = 0, length = this.length; i < length; i++) {`
412
+ `for (var i = 0, length = #{self}.length; i < length; i++) {`
393
413
  yield `i`
394
414
  `}`
395
415
 
@@ -399,15 +419,15 @@ class Array < `Array`
399
419
  def each_with_index(&block)
400
420
  return enum_for :each_with_index unless block_given?
401
421
 
402
- `for (var i = 0, length = this.length; i < length; i++) {`
403
- yield `this[i]`, `i`
422
+ `for (var i = 0, length = #{self}.length; i < length; i++) {`
423
+ yield `#{self}[i]`, `i`
404
424
  `}`
405
425
 
406
426
  self
407
427
  end
408
428
 
409
429
  def empty?
410
- `!this.length`
430
+ `!#{self}.length`
411
431
  end
412
432
 
413
433
  def fetch(index, defaults, &block)
@@ -415,11 +435,11 @@ class Array < `Array`
415
435
  var original = index;
416
436
 
417
437
  if (index < 0) {
418
- index += this.length;
438
+ index += #{self}.length;
419
439
  }
420
440
 
421
- if (index >= 0 && index < this.length) {
422
- return this[index];
441
+ if (index >= 0 && index < #{self}.length) {
442
+ return #{self}[index];
423
443
  }
424
444
 
425
445
  if (defaults != null) {
@@ -437,10 +457,10 @@ class Array < `Array`
437
457
  def first(count)
438
458
  %x{
439
459
  if (count != null) {
440
- return this.slice(0, count);
460
+ return #{self}.slice(0, count);
441
461
  }
442
462
 
443
- return this.length === 0 ? nil : this[0];
463
+ return #{self}.length === 0 ? nil : #{self}[0];
444
464
  }
445
465
  end
446
466
 
@@ -448,8 +468,8 @@ class Array < `Array`
448
468
  %x{
449
469
  var result = [];
450
470
 
451
- for (var i = 0, length = this.length, item; i < length; i++) {
452
- item = this[i];
471
+ for (var i = 0, length = #{self}.length, item; i < length; i++) {
472
+ item = #{self}[i];
453
473
 
454
474
  if (item._isArray) {
455
475
  if (level == null) {
@@ -473,10 +493,10 @@ class Array < `Array`
473
493
 
474
494
  def flatten!(level)
475
495
  %x{
476
- var size = this.length;
496
+ var size = #{self}.length;
477
497
  #{replace flatten level};
478
498
 
479
- return size === this.length ? nil : this;
499
+ return size === #{self}.length ? nil : #{self};
480
500
  }
481
501
  end
482
502
 
@@ -484,8 +504,8 @@ class Array < `Array`
484
504
  %x{
485
505
  var result = [];
486
506
 
487
- for (var i = 0, length = this.length, item; i < length; i++) {
488
- item = this[i];
507
+ for (var i = 0, length = #{self}.length, item; i < length; i++) {
508
+ item = #{self}[i];
489
509
 
490
510
  if (#{ pattern === `item` }) {
491
511
  result.push(item);
@@ -497,13 +517,13 @@ class Array < `Array`
497
517
  end
498
518
 
499
519
  def hash
500
- `this._id || (this._id = unique_id++)`
520
+ `#{self}._id || (#{self}._id = unique_id++)`
501
521
  end
502
522
 
503
523
  def include?(member)
504
524
  %x{
505
- for (var i = 0, length = this.length; i < length; i++) {
506
- if (#{`this[i]` == member}) {
525
+ for (var i = 0, length = #{self}.length; i < length; i++) {
526
+ if (#{`#{self}[i]` == member}) {
507
527
  return true;
508
528
  }
509
529
  }
@@ -517,8 +537,8 @@ class Array < `Array`
517
537
 
518
538
  %x{
519
539
  if (block !== nil) {
520
- for (var i = 0, length = this.length, value; i < length; i++) {
521
- if ((value = block.call(__context, this[i])) === __breaker) {
540
+ for (var i = 0, length = #{self}.length, value; i < length; i++) {
541
+ if ((value = block(__context, '', #{self}[i])) === __breaker) {
522
542
  return __breaker.$v;
523
543
  }
524
544
 
@@ -528,8 +548,8 @@ class Array < `Array`
528
548
  }
529
549
  }
530
550
  else {
531
- for (var i = 0, length = this.length; i < length; i++) {
532
- if (#{`this[i]` == object}) {
551
+ for (var i = 0, length = #{self}.length; i < length; i++) {
552
+ if (#{`#{self}[i]` == object}) {
533
553
  return i;
534
554
  }
535
555
  }
@@ -546,14 +566,14 @@ class Array < `Array`
546
566
  var result, i;
547
567
 
548
568
  if (initial == null) {
549
- result = this[0], i = 1;
569
+ result = #{self}[0], i = 1;
550
570
  }
551
571
  else {
552
572
  result = initial, i = 0;
553
573
  }
554
574
 
555
- for (var length = this.length, value; i < length; i++) {
556
- if ((value = block.call(__context, result, this[i])) === __breaker) {
575
+ for (var length = #{self}.length, value; i < length; i++) {
576
+ if ((value = block.call(__context, result, #{self}[i])) === __breaker) {
557
577
  return __breaker.$v;
558
578
  }
559
579
 
@@ -568,19 +588,19 @@ class Array < `Array`
568
588
  %x{
569
589
  if (objects.length > 0) {
570
590
  if (index < 0) {
571
- index += this.length + 1;
591
+ index += #{self}.length + 1;
572
592
 
573
593
  if (index < 0) {
574
594
  #{ raise "#{index} is out of bounds" };
575
595
  }
576
596
  }
577
- if (index > this.length) {
578
- for (var i = this.length; i < index; i++) {
579
- this.push(nil);
597
+ if (index > #{self}.length) {
598
+ for (var i = #{self}.length; i < index; i++) {
599
+ #{self}.push(nil);
580
600
  }
581
601
  }
582
602
 
583
- this.splice.apply(this, [index, 0].concat(objects));
603
+ #{self}.splice.apply(#{self}, [index, 0].concat(objects));
584
604
  }
585
605
  }
586
606
 
@@ -591,8 +611,8 @@ class Array < `Array`
591
611
  %x{
592
612
  var inspect = [];
593
613
 
594
- for (var i = 0, length = this.length; i < length; i++) {
595
- inspect.push(#{`this[i]`.inspect});
614
+ for (var i = 0, length = #{self}.length; i < length; i++) {
615
+ inspect.push(#{`#{self}[i]`.inspect});
596
616
  }
597
617
 
598
618
  return '[' + inspect.join(', ') + ']';
@@ -603,8 +623,8 @@ class Array < `Array`
603
623
  %x{
604
624
  var result = [];
605
625
 
606
- for (var i = 0, length = this.length; i < length; i++) {
607
- result.push(#{`this[i]`.to_s});
626
+ for (var i = 0, length = #{self}.length; i < length; i++) {
627
+ result.push(#{`#{self}[i]`.to_s});
608
628
  }
609
629
 
610
630
  return result.join(sep);
@@ -614,13 +634,13 @@ class Array < `Array`
614
634
  def keep_if(&block)
615
635
  return enum_for :keep_if unless block_given?
616
636
  %x{
617
- for (var i = 0, length = this.length, value; i < length; i++) {
618
- if ((value = block.call(__context, this[i])) === __breaker) {
637
+ for (var i = 0, length = #{self}.length, value; i < length; i++) {
638
+ if ((value = block.call(__context, #{self}[i])) === __breaker) {
619
639
  return __breaker.$v;
620
640
  }
621
641
 
622
642
  if (value === false || value === nil) {
623
- this.splice(i, 1);
643
+ #{self}.splice(i, 1);
624
644
 
625
645
  length--;
626
646
  i--;
@@ -633,10 +653,10 @@ class Array < `Array`
633
653
 
634
654
  def last(count)
635
655
  %x{
636
- var length = this.length;
656
+ var length = #{self}.length;
637
657
 
638
658
  if (count == null) {
639
- return length === 0 ? nil : this[length - 1];
659
+ return length === 0 ? nil : #{self}[length - 1];
640
660
  }
641
661
  else if (count < 0) {
642
662
  #{ raise "negative count given" };
@@ -646,12 +666,12 @@ class Array < `Array`
646
666
  count = length;
647
667
  }
648
668
 
649
- return this.slice(length - count, length);
669
+ return #{self}.slice(length - count, length);
650
670
  }
651
671
  end
652
672
 
653
673
  def length
654
- `this.length`
674
+ `#{self}.length`
655
675
  end
656
676
 
657
677
  alias map collect
@@ -660,24 +680,24 @@ class Array < `Array`
660
680
 
661
681
  def pop(count)
662
682
  %x{
663
- var length = this.length;
683
+ var length = #{self}.length;
664
684
 
665
685
  if (count == null) {
666
- return length === 0 ? nil : this.pop();
686
+ return length === 0 ? nil : #{self}.pop();
667
687
  }
668
688
 
669
689
  if (count < 0) {
670
690
  #{ raise "negative count given" };
671
691
  }
672
692
 
673
- return count > length ? this.splice(0) : this.splice(length - count, length);
693
+ return count > length ? #{self}.splice(0) : #{self}.splice(length - count, length);
674
694
  }
675
695
  end
676
696
 
677
697
  def push(*objects)
678
698
  %x{
679
699
  for (var i = 0, length = objects.length; i < length; i++) {
680
- this.push(objects[i]);
700
+ #{self}.push(objects[i]);
681
701
  }
682
702
  }
683
703
 
@@ -686,8 +706,8 @@ class Array < `Array`
686
706
 
687
707
  def rassoc(object)
688
708
  %x{
689
- for (var i = 0, length = this.length, item; i < length; i++) {
690
- item = this[i];
709
+ for (var i = 0, length = #{self}.length, item; i < length; i++) {
710
+ item = #{self}[i];
691
711
 
692
712
  if (item.length && item[1] !== undefined) {
693
713
  if (#{`item[1]` == object}) {
@@ -706,13 +726,13 @@ class Array < `Array`
706
726
  %x{
707
727
  var result = [];
708
728
 
709
- for (var i = 0, length = this.length, value; i < length; i++) {
710
- if ((value = block.call(__context, this[i])) === __breaker) {
729
+ for (var i = 0, length = #{self}.length, value; i < length; i++) {
730
+ if ((value = block(__context, #{self}[i])) === __breaker) {
711
731
  return __breaker.$v;
712
732
  }
713
733
 
714
734
  if (value === false || value === nil) {
715
- result.push(this[i]);
735
+ result.push(#{self}[i]);
716
736
  }
717
737
  }
718
738
  return result;
@@ -723,42 +743,42 @@ class Array < `Array`
723
743
  return enum_for :reject! unless block_given?
724
744
 
725
745
  %x{
726
- var original = this.length;
746
+ var original = #{self}.length;
727
747
 
728
- for (var i = 0, length = this.length, value; i < length; i++) {
729
- if ((value = block.call(__context, this[i])) === __breaker) {
748
+ for (var i = 0, length = #{self}.length, value; i < length; i++) {
749
+ if ((value = block(__context, #{self}[i])) === __breaker) {
730
750
  return __breaker.$v;
731
751
  }
732
752
 
733
753
  if (value !== false && value !== nil) {
734
- this.splice(i, 1);
754
+ #{self}.splice(i, 1);
735
755
 
736
756
  length--;
737
757
  i--;
738
758
  }
739
759
  }
740
760
 
741
- return original === this.length ? nil : this;
761
+ return original === #{self}.length ? nil : #{self};
742
762
  }
743
763
  end
744
764
 
745
765
  def replace(other)
746
766
  %x{
747
- this.splice(0);
748
- this.push.apply(this, other);
749
- return this;
767
+ #{self}.splice(0);
768
+ #{self}.push.apply(#{self}, other);
769
+ return #{self};
750
770
  }
751
771
  end
752
772
 
753
773
  def reverse
754
- `this.reverse()`
774
+ `#{self}.reverse()`
755
775
  end
756
776
 
757
777
  def reverse!
758
778
  %x{
759
- this.splice(0);
760
- this.push.apply(this, #{reverse});
761
- return this;
779
+ #{self}.splice(0);
780
+ #{self}.push.apply(#{self}, #{reverse});
781
+ return #{self};
762
782
  }
763
783
  end
764
784
 
@@ -775,8 +795,8 @@ class Array < `Array`
775
795
 
776
796
  %x{
777
797
  if (block !== nil) {
778
- for (var i = this.length - 1, value; i >= 0; i--) {
779
- if ((value = block.call(__context, this[i])) === __breaker) {
798
+ for (var i = #{self}.length - 1, value; i >= 0; i--) {
799
+ if ((value = block.call(__context, #{self}[i])) === __breaker) {
780
800
  return __breaker.$v;
781
801
  }
782
802
 
@@ -786,8 +806,8 @@ class Array < `Array`
786
806
  }
787
807
  }
788
808
  else {
789
- for (var i = this.length - 1; i >= 0; i--) {
790
- if (#{`this[i]` == `object`}) {
809
+ for (var i = #{self}.length - 1; i >= 0; i--) {
810
+ if (#{`#{self}[i]` == `object`}) {
791
811
  return i;
792
812
  }
793
813
  }
@@ -803,8 +823,8 @@ class Array < `Array`
803
823
  %x{
804
824
  var result = [];
805
825
 
806
- for (var i = 0, length = this.length, item, value; i < length; i++) {
807
- item = this[i];
826
+ for (var i = 0, length = #{self}.length, item, value; i < length; i++) {
827
+ item = #{self}[i];
808
828
 
809
829
  if ((value = block.call(__context, item)) === __breaker) {
810
830
  return __breaker.$v;
@@ -822,29 +842,29 @@ class Array < `Array`
822
842
  def select!(&block)
823
843
  return enum_for :select! unless block_given?
824
844
  %x{
825
- var original = this.length;
845
+ var original = #{self}.length;
826
846
 
827
847
  for (var i = 0, length = original, item, value; i < length; i++) {
828
- item = this[i];
848
+ item = #{self}[i];
829
849
 
830
850
  if ((value = block.call(__context, item)) === __breaker) {
831
851
  return __breaker.$v;
832
852
  }
833
853
 
834
854
  if (value === false || value === nil) {
835
- this.splice(i, 1);
855
+ #{self}.splice(i, 1);
836
856
 
837
857
  length--;
838
858
  i--;
839
859
  }
840
860
  }
841
861
 
842
- return this.length === original ? nil : this;
862
+ return #{self}.length === original ? nil : #{self};
843
863
  }
844
864
  end
845
865
 
846
866
  def shift(count)
847
- `count == null ? this.shift() : this.splice(0, count)`
867
+ `count == null ? #{self}.shift() : #{self}.splice(0, count)`
848
868
  end
849
869
 
850
870
  alias size length
@@ -854,23 +874,23 @@ class Array < `Array`
854
874
  def slice!(index, length)
855
875
  %x{
856
876
  if (index < 0) {
857
- index += this.length;
877
+ index += #{self}.length;
858
878
  }
859
879
 
860
- if (index < 0 || index >= this.length) {
880
+ if (index < 0 || index >= #{self}.length) {
861
881
  return nil;
862
882
  }
863
883
 
864
884
  if (length != null) {
865
- return this.splice(index, index + length);
885
+ return #{self}.splice(index, index + length);
866
886
  }
867
887
 
868
- return this.splice(index, 1)[0];
888
+ return #{self}.splice(index, 1)[0];
869
889
  }
870
890
  end
871
891
 
872
892
  def take(count)
873
- `this.slice(0, count)`
893
+ `#{self}.slice(0, count)`
874
894
  end
875
895
 
876
896
  def take_while(&block)
@@ -879,8 +899,8 @@ class Array < `Array`
879
899
  %x{
880
900
  var result = [];
881
901
 
882
- for (var i = 0, length = this.length, item, value; i < length; i++) {
883
- item = this[i];
902
+ for (var i = 0, length = #{self}.length, item, value; i < length; i++) {
903
+ item = #{self}[i];
884
904
 
885
905
  if ((value = block.call(__context, item)) === __breaker) {
886
906
  return __breaker.$v;
@@ -907,8 +927,8 @@ class Array < `Array`
907
927
  %x{
908
928
  var result = [];
909
929
 
910
- for (var i = 0, length = this.length; i < length; i++) {
911
- result.push(#{ `this[i]`.to_json });
930
+ for (var i = 0, length = #{self}.length; i < length; i++) {
931
+ result.push(#{ `#{self}[i]`.to_json });
912
932
  }
913
933
 
914
934
  return '[' + result.join(', ') + ']';
@@ -922,9 +942,9 @@ class Array < `Array`
922
942
  var result = [],
923
943
  seen = {};
924
944
 
925
- for (var i = 0, length = this.length, item, hash; i < length; i++) {
926
- item = this[i];
927
- hash = item.$hash();
945
+ for (var i = 0, length = #{self}.length, item, hash; i < length; i++) {
946
+ item = #{self}[i];
947
+ hash = item;
928
948
 
929
949
  if (!seen[hash]) {
930
950
  seen[hash] = true;
@@ -939,44 +959,44 @@ class Array < `Array`
939
959
 
940
960
  def uniq!
941
961
  %x{
942
- var original = this.length,
962
+ var original = #{self}.length,
943
963
  seen = {};
944
964
 
945
965
  for (var i = 0, length = original, item, hash; i < length; i++) {
946
- item = this[i];
947
- hash = item.$hash();
966
+ item = #{self}[i];
967
+ hash = item;
948
968
 
949
969
  if (!seen[hash]) {
950
970
  seen[hash] = true;
951
971
  }
952
972
  else {
953
- this.splice(i, 1);
973
+ #{self}.splice(i, 1);
954
974
 
955
975
  length--;
956
976
  i--;
957
977
  }
958
978
  }
959
979
 
960
- return this.length === original ? nil : this;
980
+ return #{self}.length === original ? nil : #{self};
961
981
  }
962
982
  end
963
983
 
964
984
  def unshift(*objects)
965
985
  %x{
966
986
  for (var i = 0, length = objects.length; i < length; i++) {
967
- this.unshift(objects[i]);
987
+ #{self}.unshift(objects[i]);
968
988
  }
969
989
 
970
- return this;
990
+ return #{self};
971
991
  }
972
992
  end
973
993
 
974
994
  def zip(*others, &block)
975
995
  %x{
976
- var result = [], size = this.length, part, o;
996
+ var result = [], size = #{self}.length, part, o;
977
997
 
978
998
  for (var i = 0; i < size; i++) {
979
- part = [this[i]];
999
+ part = [#{self}[i]];
980
1000
 
981
1001
  for (var j = 0, jj = others.length; j < jj; j++) {
982
1002
  o = others[j][i];
@@ -993,7 +1013,7 @@ class Array < `Array`
993
1013
 
994
1014
  if (block !== nil) {
995
1015
  for (var i = 0; i < size; i++) {
996
- block.call(__context, result[i]);
1016
+ block(__context, result[i]);
997
1017
  }
998
1018
 
999
1019
  return nil;