opal 0.3.6 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/README.md +69 -97
  2. data/bin/opal +2 -2
  3. data/{lib/core → corelib}/array.rb +85 -56
  4. data/corelib/boolean.rb +20 -0
  5. data/corelib/class.rb +58 -0
  6. data/{lib → corelib}/core.rb +2 -50
  7. data/corelib/dir.rb +22 -0
  8. data/{lib/core → corelib}/enumerable.rb +0 -0
  9. data/corelib/error.rb +19 -0
  10. data/{lib/core → corelib}/file.rb +7 -9
  11. data/{lib/core → corelib}/hash.rb +104 -144
  12. data/{lib/core → corelib}/kernel.rb +38 -44
  13. data/corelib/load_order +21 -0
  14. data/{lib/core → corelib}/match_data.rb +0 -0
  15. data/{lib/core → corelib}/module.rb +12 -8
  16. data/{lib/core → corelib}/nil_class.rb +2 -2
  17. data/{lib/core → corelib}/numeric.rb +37 -100
  18. data/corelib/object.rb +37 -0
  19. data/{lib/core → corelib}/proc.rb +3 -3
  20. data/corelib/range.rb +27 -0
  21. data/{lib/core → corelib}/regexp.rb +1 -1
  22. data/{lib/core → corelib}/string.rb +16 -107
  23. data/{lib/core → corelib}/top_self.rb +0 -0
  24. data/lib/opal.rb +7 -0
  25. data/lib/opal/browserify.rb +34 -0
  26. data/{opal_lib → lib}/opal/builder.rb +70 -24
  27. data/lib/opal/command.rb +52 -0
  28. data/lib/opal/context.rb +197 -0
  29. data/{opal_lib/opal/ruby/parser.rb → lib/opal/lexer.rb} +20 -4
  30. data/{opal_lib/opal/ruby → lib/opal}/nodes.rb +238 -127
  31. data/lib/opal/parser.rb +4894 -0
  32. data/{opal_lib/opal/ruby/ruby_parser.y → lib/opal/parser.y} +38 -18
  33. data/lib/rbp.rb +2 -0
  34. data/lib/rbp/package.rb +49 -0
  35. data/runtime/class.js +216 -189
  36. data/runtime/fs.js +2 -2
  37. data/runtime/init.js +242 -244
  38. data/runtime/loader.js +78 -99
  39. data/runtime/module.js +34 -40
  40. data/runtime/post.js +2 -2
  41. data/runtime/pre.js +1 -1
  42. data/runtime/runtime.js +129 -135
  43. data/{lib → stdlib}/dev.rb +10 -10
  44. data/{lib → stdlib}/racc/parser.rb +0 -6
  45. data/{lib → stdlib}/strscan.rb +4 -4
  46. metadata +57 -105
  47. data/lib/core/basic_object.rb +0 -51
  48. data/lib/core/class.rb +0 -38
  49. data/lib/core/dir.rb +0 -26
  50. data/lib/core/error.rb +0 -75
  51. data/lib/core/false_class.rb +0 -81
  52. data/lib/core/object.rb +0 -6
  53. data/lib/core/range.rb +0 -27
  54. data/lib/core/symbol.rb +0 -42
  55. data/lib/core/true_class.rb +0 -41
  56. data/lib/ospec.rb +0 -7
  57. data/lib/ospec/autorun.rb +0 -8
  58. data/lib/ospec/dsl.rb +0 -15
  59. data/lib/ospec/example.rb +0 -11
  60. data/lib/ospec/example/before_and_after_hooks.rb +0 -56
  61. data/lib/ospec/example/errors.rb +0 -17
  62. data/lib/ospec/example/example_group.rb +0 -12
  63. data/lib/ospec/example/example_group_factory.rb +0 -18
  64. data/lib/ospec/example/example_group_hierarchy.rb +0 -21
  65. data/lib/ospec/example/example_group_methods.rb +0 -100
  66. data/lib/ospec/example/example_group_proxy.rb +0 -15
  67. data/lib/ospec/example/example_methods.rb +0 -46
  68. data/lib/ospec/example/example_proxy.rb +0 -18
  69. data/lib/ospec/expectations.rb +0 -19
  70. data/lib/ospec/expectations/errors.rb +0 -8
  71. data/lib/ospec/expectations/fail_with.rb +0 -9
  72. data/lib/ospec/expectations/handler.rb +0 -33
  73. data/lib/ospec/helpers/scratch.rb +0 -18
  74. data/lib/ospec/matchers.rb +0 -24
  75. data/lib/ospec/matchers/be.rb +0 -1
  76. data/lib/ospec/matchers/generated_descriptions.rb +0 -20
  77. data/lib/ospec/matchers/operator_matcher.rb +0 -54
  78. data/lib/ospec/matchers/raise_error.rb +0 -38
  79. data/lib/ospec/runner.rb +0 -90
  80. data/lib/ospec/runner/example_group_runner.rb +0 -41
  81. data/lib/ospec/runner/formatter/html_formatter.rb +0 -139
  82. data/lib/ospec/runner/formatter/terminal_formatter.rb +0 -48
  83. data/lib/ospec/runner/options.rb +0 -34
  84. data/lib/ospec/runner/reporter.rb +0 -82
  85. data/opal_lib/opal.rb +0 -16
  86. data/opal_lib/opal/build_methods.rb +0 -51
  87. data/opal_lib/opal/bundle.rb +0 -70
  88. data/opal_lib/opal/command.rb +0 -68
  89. data/opal_lib/opal/context.rb +0 -81
  90. data/opal_lib/opal/context/console.rb +0 -10
  91. data/opal_lib/opal/context/file_system.rb +0 -34
  92. data/opal_lib/opal/context/loader.rb +0 -135
  93. data/opal_lib/opal/gem.rb +0 -84
  94. data/opal_lib/opal/rake/builder_task.rb +0 -44
  95. data/opal_lib/opal/rake/spec_task.rb +0 -32
  96. data/opal_lib/opal/ruby/ruby_parser.rb +0 -4862
  97. data/opal_lib/opal/version.rb +0 -4
  98. data/runtime/debug.js +0 -84
data/README.md CHANGED
@@ -1,126 +1,98 @@
1
- Opal: Ruby runtime for javascript
2
- =================================
1
+ Opal
2
+ ====
3
3
 
4
- **Homepage**: [http://opalscript.org](http://opalscript.org)
5
- **Github**: [http://github.com/adambeynon/opal](http://github.com/adambeynon/opal)
4
+ Opal is a partial implementation of ruby designed to run in any
5
+ javascript environment. The runtime is written in javascript, with all
6
+ core libraries written directly in ruby with inline javascript to make
7
+ them as fast as possible.
6
8
 
7
- Description
8
- -----------
9
+ Wherever possible ruby objects are mapped directly onto their native
10
+ javascript counterparts to speed up the generated code and to improve
11
+ interopability with existing javascript libraries.
9
12
 
10
- Opal is a Ruby runtime and standard library designed to run directly on
11
- top of javascript. It can be run within the browser or on the command
12
- line through the bundled build tools. Opal includes a parser/compiler
13
- that builds ruby ahead of time directly into javascript that runs with
14
- the bundled runtime.
13
+ The opal compiler is a source-to-source compiler which outputs
14
+ javascript which can then run on the core runtime.
15
15
 
16
- Features
17
- --------
16
+ Opal does not aim to be 100% comaptible with other ruby implementations,
17
+ but does so where the generated code can be efficient on all modern web
18
+ browsers - including older versions of IE and mobile devices.
18
19
 
19
- * Full method\_missing support for all objects and classes
20
- * Debug mode to provide stack traces and arg checking
21
- * Private and public method support
22
- * Full operator overloading (`[]`, `[]=`, `+`, `-`, `==`, etc)
23
- * Toll free bridges to javascript objects (`String`, `Number`, `Array`
24
- etc)
25
- * Inline javascript within ruby code using backticks
26
- * In browser loading of `<script type="text/ruby></script>` tags
27
- * Generated code is clean and maintains line numbers to ease debugging
28
- * super(), metaclasses, eigenclasses, blocks, yield, block\_given?,
29
- ranges, arg count errors, lambda, singletons, etc....
20
+ Using opal
21
+ ----------
30
22
 
31
- Installation
32
- ------------
23
+ Opal can currently be used in two ways: through a distributed ruby gem,
24
+ or directly in the web browser.
33
25
 
34
- The best way to get started with opal is to clone this repo and use the
35
- `opal` bin file directly:
26
+ ### Using the gem
36
27
 
37
- $ git clone git://github.com/adambeynon/opal.git
28
+ Install via ruby gems:
38
29
 
39
- Although opal is distributed as a gem, the latest gem release is mostly
40
- incompatible with the loading and runtime system for opal, so until a
41
- newer gem is released (0.3.5), it is best to stick with the repo.
30
+ ```
31
+ $ gem install opal
32
+ ```
42
33
 
43
- ### Try without installing
34
+ The `opal` command should then be available. To run the simple repl use:
44
35
 
45
- Browser can be used inside a repl on the
46
- [http://opalscript.org](http://opalscript.org) homepage which gives an
47
- IRB style interface for running ruby code which is compiled and
48
- evaluated within the browser (no plugins!).
36
+ ```
37
+ opal irb
38
+ ```
49
39
 
50
- Alternatively the opal runtime and opal parser can be downloaded
51
- directly from the `extras` directory in this repository.
40
+ The `opal` command can also be used directly from this source repo, so
41
+ to download and run opal:
52
42
 
53
- Usage
54
- -----
43
+ ```
44
+ $ git clone https://github.com/adambeynon/opal.git
45
+ $ cd opal
46
+ $ bin/opal
47
+ ```
55
48
 
56
- Opal can be used within in the browser, or on the command line using the
57
- build tools. A Nodejs environment is also partially implemented.
58
-
59
- ### Browser
60
-
61
- To run within the browser, you can either use the latest build version
62
- on the opal website, or clone the build tools as above, and then run the
63
- following task in this directory:
64
-
65
- $ rake opal
66
-
67
- This will place a non minified version ready to run within the browser
68
- into `extras/opal.js`
69
-
70
- #### Compiling ruby sources
71
-
72
- To run ruby code in the browser, ruby must either be precompiled to
73
- javascript using these build tools, or the `opal_dev.js` file can parse
74
- and compile ruby code referenced in html `script` tags that use the
75
- `text/ruby` type.
76
-
77
- ### Command line
78
-
79
- Opal is bundled with a set of build tools available in the `opalite/`
80
- directory. These are available when running opal from the command line
81
- or including it from ruby sources.
82
-
83
- #### Ruby repl
84
-
85
- To run the repl, clone this repo as directed above and run:
49
+ Running tests
50
+ -------------
86
51
 
87
- $ bin/opal irb
52
+ To run tests, you need opaltest which is the testing framework for opal
53
+ based on minitest. To get opaltest, run the following in the opal
54
+ directory:
88
55
 
89
- This will act like any other repl to try out commands. The repl relies
90
- on `therubyracer` as its javascript engine.
56
+ ```
57
+ $ rake vendor
58
+ ```
91
59
 
92
- Running tests
93
- -------------
60
+ This will put opaltest into `vendor/opaltest` so it will be available
61
+ for running. To test `array.rb` for example, run:
94
62
 
95
- Opal uses a subset of the `rubyspec` specs for ruby until it reaches a
96
- mature enough state to just use rubyspec directly. These tests are found
97
- in the `spec/` folder. They can be run either through the command line,
98
- or built ready to open in the browser.
63
+ ```
64
+ $ bin/opal test/array.rb
65
+ ```
99
66
 
100
- ### Running in the browser
67
+ The results should be printed to the console.
101
68
 
102
- To run in the browser, first build the specs (compile into js ready):
69
+ Differences from ruby
70
+ ---------------------
103
71
 
104
- $ rake opal_spec
72
+ ### No method\_missing
105
73
 
106
- This will build the specs into `extras/` so open `extras/opal.spec.html`
107
- in any browser to see how the specs run.
74
+ To optimize method dispatch, `method_missing` is not supported in opal.
75
+ It is supported in debug mode to improve readability of error messages
76
+ from calling undefined methods, but should/will not be used in
77
+ production code.
108
78
 
109
- ### Running on command line
79
+ ### Immutable strings and removed symbols
110
80
 
111
- The opal binary has a `spec` flag which can be passed one or any number
112
- of specs. For example, to run the `and` and `&&` specs from this repo,
113
- run:
81
+ All strings in opal are immutable to make them easier to map onto
82
+ javascript strings. In opal a ruby string compiles directly into a js
83
+ string without a wrapper so that they can be passed back between code
84
+ bases easily. Also, symbol syntax is maintained, but all symbols just
85
+ compile into javascript strings. The `Symbol` class is also therefore
86
+ removed.
114
87
 
115
- $ bin/opal spec spec/language/and_spec.rb
88
+ ### Unified Numeric class
116
89
 
117
- Between gem releases every spec will pass. The master branch in this
118
- repo may contain broken specs, but these will be fixed before the next
119
- gem release and version bump.
90
+ All numbers in opal are members of the `Numeric` class. The `Integer`
91
+ and `Float` classes are removed.
120
92
 
121
- Examples
122
- --------
93
+ ### Unified Boolean class
123
94
 
124
- Examples can be found in the `examples/` directory in this repo, and
125
- rely on `extras/opal.js` being created using the above commands.
95
+ Both `true` and `false` compile into their native javascript
96
+ counterparts which means that they both become instances of the
97
+ `Boolean` class and opal removes the `TrueClass` and `FalseClass`.
126
98
 
data/bin/opal CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- opal_lib = File.expand_path('../../opal_lib', __FILE__)
3
+ opal_lib = File.expand_path('../../lib', __FILE__)
4
4
  $:.unshift opal_lib unless $:.include? opal_lib
5
5
 
6
6
  require 'opal'
7
7
  require 'opal/command'
8
8
 
9
- Opal::Command.start
9
+ Opal::Command.new ARGV
10
10
 
@@ -16,20 +16,16 @@ class Array
16
16
  end
17
17
 
18
18
  def self.allocate
19
- `var arr = [];
20
- arr.$klass = self;
21
- arr.$m = self.$m_tbl;
22
- return arr;`
19
+ `var ary = new self.$a();
20
+ return ary;`
23
21
  end
24
22
 
25
- def initialize(len, fill = nil)
26
- `var ary = self;
27
-
28
- for (var i = 0; i < len; i++) {
29
- ary[i] = fill;
23
+ def initialize(len = 0, fill = nil)
24
+ `for (var i = 0; i < len; i++) {
25
+ self[i] = fill;
30
26
  }
31
27
 
32
- ary.length = len;
28
+ self.length = len;
33
29
 
34
30
  return self;`
35
31
  end
@@ -120,9 +116,9 @@ class Array
120
116
  def each_with_index
121
117
  raise "Array#each_with_index no block given" unless block_given?
122
118
 
123
- `for (var i = 0, len = self.length; i < len; i++) {
124
- #{ yield `self[i]`, `i` };
125
- }`
119
+ `for (var i = 0, len = self.length; i < len; i++) {`
120
+ yield `self[i]`, `i`
121
+ `}`
126
122
  self
127
123
  end
128
124
 
@@ -235,16 +231,16 @@ class Array
235
231
  # @param [Array] other array to compare self with
236
232
  # @return [Boolean] if the arrays are equal
237
233
  def ==(other)
238
- `if (self.$hash() == other.$hash()) return Qtrue;
239
- if (self.length != other.length) return Qfalse;
234
+ `if (self.$h() == other.$h()) return true;
235
+ if (self.length != other.length) return false;
240
236
 
241
237
  for (var i = 0; i < self.length; i++) {
242
- if (!#{`self[i]` == `other[i]`}.$r) {
243
- return Qfalse;
238
+ if (!#{`self[i]` == `other[i]`}) {
239
+ return false;
244
240
  }
245
241
  }
246
242
 
247
- return Qtrue;`
243
+ return true;`
248
244
  end
249
245
 
250
246
  # Searches through an array whose elements are also arrays, comparing `obj`
@@ -288,9 +284,11 @@ class Array
288
284
  # @param [Numeric] index the index to get
289
285
  # @return [Object, nil] returns nil or the result
290
286
  def at(idx)
291
- `if (idx < 0) idx += self.length;
287
+ `var size = self.length;
292
288
 
293
- if (idx < 0 || idx >= self.length) return nil;
289
+ if (idx < 0) idx += size;
290
+
291
+ if (idx < 0 || idx >= size) return nil;
294
292
  return self[idx];`
295
293
  end
296
294
 
@@ -457,7 +455,7 @@ class Array
457
455
  #
458
456
  # @param [Object] obj object to check
459
457
  # @return [Numeric] count or count of obj
460
- def count(obj)
458
+ def count(obj = undefined)
461
459
  `if (obj != undefined) {
462
460
  var total = 0;
463
461
 
@@ -594,7 +592,7 @@ class Array
594
592
  #
595
593
  # @return [false, true] empty or not
596
594
  def empty?
597
- `return self.length == 0 ? Qtrue : Qfalse;`
595
+ `return self.length == 0;`
598
596
  end
599
597
 
600
598
  # Tries to return the element as position `index`. If the index lies outside
@@ -624,13 +622,13 @@ class Array
624
622
  # @param [Numeric] idx
625
623
  # @param [Object] defaults
626
624
  # @return [Object] returns result
627
- def fetch(idx, defaults)
625
+ def fetch(idx, defaults = undefined)
628
626
  `var original = idx;
629
627
 
630
628
  if (idx < 0) idx += self.length;
631
629
  if (idx < 0 || idx >= self.length) {
632
630
  if (defaults == undefined)
633
- return rb_raise("Index Error: Array#fetch");
631
+ raise(eIndexError, "Array#fetch");
634
632
  else if (__block__)
635
633
  return #{yield `original`};
636
634
  else
@@ -654,8 +652,8 @@ class Array
654
652
  #
655
653
  # @param [Numeric] count number of elements
656
654
  # @return [Object, Array] object or array of objects
657
- def first(count = nil)
658
- `if (count == nil) {
655
+ def first(count = undefined)
656
+ `if (count == undefined) {
659
657
  if (self.length == 0) return nil;
660
658
  return self[0];
661
659
  }
@@ -683,14 +681,14 @@ class Array
683
681
  #
684
682
  # @param [Numeric] level the level to flatten
685
683
  # @return [Array] returns new array
686
- def flatten(level = nil)
684
+ def flatten(level = undefined)
687
685
  `var result = [], item;
688
686
 
689
687
  for (var i = 0; i < self.length; i++) {
690
688
  item = self[i];
691
689
 
692
- if (item.hasOwnProperty('length')) {
693
- if (level == nil)
690
+ if (item.o$f & T_ARRAY) {
691
+ if (level == undefined)
694
692
  result = result.concat(#{`item`.flatten});
695
693
  else if (level == 0)
696
694
  result.push(item);
@@ -719,7 +717,7 @@ class Array
719
717
  #
720
718
  # @param [Number] level to flatten to
721
719
  # @return [Array] returns the receiver
722
- def flatten!(level = nil)
720
+ def flatten!(level = undefined)
723
721
  `var length = self.length;
724
722
  var result = #{self.flatten level};
725
723
  self.splice(0);
@@ -734,6 +732,20 @@ class Array
734
732
  return self;`
735
733
  end
736
734
 
735
+ def grep(pattern)
736
+ `var result = [], arg;
737
+
738
+ for (var i = 0, ii = self.length; i < ii; i++) {
739
+ arg = self[i];
740
+
741
+ if (pattern.exec(arg)) {
742
+ result.push(arg);
743
+ }
744
+ }
745
+
746
+ return result;`
747
+ end
748
+
737
749
  # Returns true if the given object is present in `self`, false otherwise.
738
750
  #
739
751
  # @example
@@ -745,7 +757,7 @@ class Array
745
757
  # # => false
746
758
  def include?(member)
747
759
  `for (var i = 0; i < self.length; i++) {
748
- if (#{`self[i]` == member}.$r) {
760
+ if (#{`self[i]` == member}) {
749
761
  return #{true};
750
762
  }
751
763
  }
@@ -753,6 +765,17 @@ class Array
753
765
  return #{false};`
754
766
  end
755
767
 
768
+ def inject(initial = undefined)
769
+ `if (initial === undefined) initial = self[0];
770
+ var result;
771
+
772
+ for (var i = 0, ii = self.length; i < ii; i++) {
773
+ initial = #{ yield `initial`, `self[i]` };
774
+ }
775
+
776
+ return initial;`
777
+ end
778
+
756
779
  # Replaces the contents of `self` with the contents of `other`, truncating or
757
780
  # expanding if necessary.
758
781
  #
@@ -791,10 +814,12 @@ class Array
791
814
  # @param [Object] objs objects to insert
792
815
  # @return [Array] returns the receiver
793
816
  def insert(idx, *objs)
794
- `if (idx < 0) idx += self.length;
817
+ `var size = self.length;
795
818
 
796
- if (idx < 0 || idx >= self.length)
797
- rb_raise("IndexError: out of range");
819
+ if (idx < 0) idx += size;
820
+
821
+ if (idx < 0 || idx >= size)
822
+ raise(eIndexError, "out of range");
798
823
 
799
824
  self.splice.apply(self, [idx, 0].concat(objs));
800
825
  return self;`
@@ -855,13 +880,15 @@ class Array
855
880
  #
856
881
  # @param [Number] count the number of items to get
857
882
  # @return [Object, Array] result
858
- def last(count = nil)
859
- `if (count == nil) {
860
- if (self.length == 0) return nil;
861
- return self[self.length - 1];
883
+ def last(count = undefined)
884
+ `var size = self.length;
885
+
886
+ if (count == undefined) {
887
+ if (size == 0) return nil;
888
+ return self[size - 1];
862
889
  } else {
863
- if (count > self.length) count = self.length;
864
- return self.slice(self.length - count, self.length);
890
+ if (count > size) count = size;
891
+ return self.slice(size - count, size);
865
892
  }`
866
893
  end
867
894
 
@@ -881,12 +908,14 @@ class Array
881
908
  #
882
909
  # @param [Numeric] count number to pop
883
910
  # @return [Array] returns popped items
884
- def pop(count = nil)
885
- `if (count == nil) {
886
- if (self.length) return self.pop();
911
+ def pop(count = undefined)
912
+ `var size = self.length;
913
+
914
+ if (count == undefined) {
915
+ if (size) return self.pop();
887
916
  return nil;
888
917
  } else {
889
- return self.splice(self.length - count, self.length);
918
+ return self.splice(size - count, size);
890
919
  }`
891
920
  end
892
921
 
@@ -909,7 +938,7 @@ class Array
909
938
 
910
939
  for (var i = 0; i < self.length; i++) {
911
940
  test = self[i];
912
- if (test.hasOwnProperty('length') && test[1] != undefined) {
941
+ if (test.o$f & T_ARRAY && test[1] != undefined) {
913
942
  if (#{`test[1]` == obj}.$r) return test;
914
943
  }
915
944
  }
@@ -1048,7 +1077,7 @@ class Array
1048
1077
  # # => 3
1049
1078
  #
1050
1079
  # @return [Object, nil] returns result or nil
1051
- def rindex(obj = `undefined`)
1080
+ def rindex(obj = undefined)
1052
1081
  `if (obj != undefined) {
1053
1082
  for (var i = self.length - 1; i >=0; i--) {
1054
1083
  if (#{`self[i]` == obj}.$r) {
@@ -1056,7 +1085,7 @@ class Array
1056
1085
  }
1057
1086
  }
1058
1087
  } else if (true || __block__) {
1059
- rb_raise("array#rindex needs to do block action");
1088
+ raise(eException, "Array#rindex needs to do block action");
1060
1089
  }
1061
1090
 
1062
1091
  return nil;`
@@ -1111,11 +1140,11 @@ class Array
1111
1140
  #
1112
1141
  # @param [Numeric] count elements to shift
1113
1142
  # @return [Array] result
1114
- def shift(count = nil)
1115
- `if (count != nil)
1143
+ def shift(count = undefined)
1144
+ `if (count != undefined)
1116
1145
  return self.splice(0, count);
1117
1146
 
1118
- if (self.length)
1147
+ if (self.length)
1119
1148
  return self.shift();
1120
1149
 
1121
1150
  return nil;`
@@ -1226,7 +1255,7 @@ class Array
1226
1255
  `var result = [], seen = [];
1227
1256
 
1228
1257
  for (var i = 0; i < self.length; i++) {
1229
- var test = self[i], hash = test.$hash();
1258
+ var test = self[i], hash = test.$h();
1230
1259
  if (seen.indexOf(hash) == -1) {
1231
1260
  seen.push(hash);
1232
1261
  result.push(test);
@@ -1252,7 +1281,7 @@ class Array
1252
1281
  `var seen = [], length = self.length;
1253
1282
 
1254
1283
  for (var i = 0; i < self.length; i++) {
1255
- var test = self[i], hash = test.$hash();
1284
+ var test = self[i], hash = test.$h();
1256
1285
  if (seen.indexOf(hash) == -1) {
1257
1286
  seen.push(hash);
1258
1287
  } else {
@@ -1298,11 +1327,11 @@ class Array
1298
1327
  `var result = [], seen = [];
1299
1328
 
1300
1329
  for (var i = 0; i < self.length; i++) {
1301
- var test = self[i], hash = test.$hash();
1330
+ var test = self[i], hash = test.$h();
1302
1331
 
1303
1332
  if (seen.indexOf(hash) == -1) {
1304
1333
  for (var j = 0; j < other.length; j++) {
1305
- var test_b = other[j], hash_b = test_b.$hash();
1334
+ var test_b = other[j], hash_b = test_b.$h();
1306
1335
 
1307
1336
  if ((hash == hash_b) && seen.indexOf(hash) == -1) {
1308
1337
  seen.push(hash);
@@ -1332,7 +1361,7 @@ class Array
1332
1361
  # @param [String, Number] num string or number used to join or concat
1333
1362
  # @return [String, Array] depending on argument
1334
1363
  def *(arg)
1335
- `if (typeof arg == 'string') {
1364
+ `if (arg.o$f & T_STRING) {
1336
1365
  return #{self.join `arg`};
1337
1366
  } else {
1338
1367
  var result = [];
@@ -1369,7 +1398,7 @@ class Array
1369
1398
  # @param [Range, Numeric] index to begin
1370
1399
  # @param [Numeric] length last index
1371
1400
  # @return [Array, Object, nil] result
1372
- def [](index, length = `undefined`)
1401
+ def [](index, length = undefined)
1373
1402
  `var ary = self, size = ary.length;
1374
1403
 
1375
1404
  if (index < 0) index += size;