opal 0.3.18 → 0.3.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. data/.gitignore +1 -1
  2. data/Gemfile +1 -3
  3. data/README.md +472 -10
  4. data/Rakefile +10 -52
  5. data/core/array.rb +9 -14
  6. data/core/basic_object.rb +7 -10
  7. data/core/boolean.rb +5 -1
  8. data/core/class.rb +15 -38
  9. data/core/dir.rb +89 -0
  10. data/core/enumerable.rb +133 -57
  11. data/core/error.rb +15 -1
  12. data/core/file.rb +85 -0
  13. data/core/hash.rb +186 -32
  14. data/core/kernel.rb +30 -31
  15. data/core/load_order +4 -2
  16. data/core/module.rb +42 -62
  17. data/core/numeric.rb +7 -1
  18. data/core/object.rb +1 -1
  19. data/core/proc.rb +6 -2
  20. data/core/range.rb +16 -28
  21. data/core/regexp.rb +3 -3
  22. data/core/runtime.js +281 -350
  23. data/core/string.rb +100 -110
  24. data/docs/CNAME +1 -0
  25. data/docs/Rakefile +55 -0
  26. data/docs/css/styles.css +50 -0
  27. data/docs/css/syntax.css +63 -0
  28. data/docs/layout/post.html +3 -0
  29. data/docs/layout/pre.html +11 -0
  30. data/examples/dependencies/app.rb +3 -0
  31. data/lib/opal.rb +2 -1
  32. data/lib/opal/builder.rb +36 -10
  33. data/lib/opal/builder_task.rb +51 -24
  34. data/lib/opal/grammar.rb +2509 -2439
  35. data/lib/opal/grammar.y +38 -5
  36. data/lib/opal/lexer.rb +18 -2
  37. data/lib/opal/parser.rb +375 -349
  38. data/lib/opal/scope.rb +24 -2
  39. data/lib/opal/version.rb +1 -1
  40. data/spec/builder/build_order_spec.rb +20 -0
  41. data/spec/builder/lib_name_for_spec.rb +24 -0
  42. data/spec/grammar/call_spec.rb +9 -6
  43. data/spec/grammar/lambda_spec.rb +64 -0
  44. data/spec/grammar/sclass_spec.rb +5 -3
  45. data/{core/spec → test}/core/array/allocate_spec.rb +0 -0
  46. data/{core/spec → test}/core/array/append_spec.rb +0 -0
  47. data/{core/spec → test}/core/array/assoc_spec.rb +0 -0
  48. data/{core/spec → test}/core/array/at_spec.rb +0 -0
  49. data/{core/spec → test}/core/array/clear_spec.rb +0 -0
  50. data/{core/spec → test}/core/array/clone_spec.rb +0 -0
  51. data/{core/spec → test}/core/array/collect_spec.rb +0 -0
  52. data/{core/spec → test}/core/array/compact_spec.rb +0 -0
  53. data/{core/spec → test}/core/array/concat_spec.rb +0 -0
  54. data/{core/spec → test}/core/array/constructor_spec.rb +0 -0
  55. data/{core/spec → test}/core/array/count_spec.rb +0 -0
  56. data/{core/spec → test}/core/array/delete_at_spec.rb +0 -0
  57. data/{core/spec → test}/core/array/delete_if_spec.rb +0 -0
  58. data/{core/spec → test}/core/array/delete_spec.rb +0 -0
  59. data/{core/spec → test}/core/array/each_index_spec.rb +0 -0
  60. data/{core/spec → test}/core/array/each_spec.rb +0 -0
  61. data/{core/spec → test}/core/array/element_reference_spec.rb +0 -0
  62. data/{core/spec → test}/core/array/empty_spec.rb +0 -0
  63. data/{core/spec → test}/core/array/eql_spec.rb +0 -0
  64. data/{core/spec → test}/core/array/fetch_spec.rb +0 -0
  65. data/{core/spec → test}/core/array/first_spec.rb +0 -0
  66. data/{core/spec → test}/core/array/flatten_spec.rb +0 -0
  67. data/{core/spec → test}/core/array/include_spec.rb +0 -0
  68. data/{core/spec → test}/core/array/insert_spec.rb +0 -0
  69. data/{core/spec → test}/core/array/last_spec.rb +0 -0
  70. data/{core/spec → test}/core/array/length_spec.rb +0 -0
  71. data/{core/spec → test}/core/array/map_spec.rb +0 -0
  72. data/{core/spec → test}/core/array/plus_spec.rb +0 -0
  73. data/{core/spec → test}/core/array/pop_spec.rb +0 -0
  74. data/{core/spec → test}/core/array/push_spec.rb +0 -0
  75. data/{core/spec → test}/core/array/rassoc_spec.rb +0 -0
  76. data/{core/spec → test}/core/array/reject_spec.rb +0 -0
  77. data/{core/spec → test}/core/array/replace_spec.rb +0 -0
  78. data/{core/spec → test}/core/array/reverse_each_spec.rb +0 -0
  79. data/{core/spec → test}/core/array/reverse_spec.rb +0 -0
  80. data/{core/spec → test}/core/array/size_spec.rb +0 -0
  81. data/{core/spec → test}/core/array/to_ary_spec.rb +0 -0
  82. data/{core/spec → test}/core/array/uniq_spec.rb +0 -0
  83. data/{core/spec → test}/core/array/zip_spec.rb +0 -0
  84. data/test/core/class/fixtures/classes.rb +9 -0
  85. data/test/core/class/new_spec.rb +108 -0
  86. data/{core/spec → test}/core/enumerable/all_spec.rb +0 -0
  87. data/{core/spec → test}/core/enumerable/any_spec.rb +0 -0
  88. data/{core/spec → test}/core/enumerable/collect_spec.rb +0 -0
  89. data/{core/spec → test}/core/enumerable/count_spec.rb +0 -0
  90. data/test/core/enumerable/detect_spec.rb +48 -0
  91. data/test/core/enumerable/drop_spec.rb +17 -0
  92. data/test/core/enumerable/drop_while_spec.rb +24 -0
  93. data/test/core/enumerable/each_with_index_spec.rb +11 -0
  94. data/test/core/enumerable/each_with_object_spec.rb +17 -0
  95. data/test/core/enumerable/entries_spec.rb +6 -0
  96. data/test/core/enumerable/find_all_spec.rb +13 -0
  97. data/test/core/enumerable/find_index_spec.rb +45 -0
  98. data/test/core/enumerable/find_spec.rb +48 -0
  99. data/test/core/enumerable/first_spec.rb +40 -0
  100. data/{core/spec → test}/core/enumerable/fixtures/classes.rb +19 -0
  101. data/test/core/enumerable/grep_spec.rb +21 -0
  102. data/test/core/enumerable/take_spec.rb +40 -0
  103. data/test/core/enumerable/to_a_spec.rb +6 -0
  104. data/{core/spec → test}/core/false/and_spec.rb +0 -0
  105. data/{core/spec → test}/core/false/inspect_spec.rb +0 -0
  106. data/{core/spec → test}/core/false/or_spec.rb +0 -0
  107. data/{core/spec → test}/core/false/to_s_spec.rb +0 -0
  108. data/{core/spec → test}/core/false/xor_spec.rb +0 -0
  109. data/test/core/file/expand_path_spec.rb +20 -0
  110. data/{core/spec → test}/core/hash/allocate_spec.rb +0 -0
  111. data/{core/spec → test}/core/hash/assoc_spec.rb +0 -0
  112. data/{core/spec → test}/core/hash/clear_spec.rb +0 -0
  113. data/{core/spec → test}/core/hash/clone_spec.rb +0 -0
  114. data/test/core/hash/default_spec.rb +9 -0
  115. data/{core/spec → test}/core/hash/delete_if_spec.rb +0 -0
  116. data/test/core/hash/each_key_spec.rb +15 -0
  117. data/test/core/hash/each_pair_spec.rb +30 -0
  118. data/test/core/hash/each_spec.rb +30 -0
  119. data/test/core/hash/each_value_spec.rb +15 -0
  120. data/{core/spec → test}/core/hash/element_reference_spec.rb +14 -0
  121. data/{core/spec → test}/core/hash/element_set_spec.rb +1 -0
  122. data/test/core/hash/empty_spec.rb +10 -0
  123. data/test/core/hash/fetch_spec.rb +24 -0
  124. data/test/core/hash/flatten_spec.rb +46 -0
  125. data/test/core/hash/has_key_spec.rb +24 -0
  126. data/test/core/hash/has_value_spec.rb +12 -0
  127. data/test/core/hash/include_spec.rb +24 -0
  128. data/test/core/hash/index_spec.rb +13 -0
  129. data/test/core/hash/indexes_spec.rb +9 -0
  130. data/test/core/hash/indices_spec.rb +9 -0
  131. data/test/core/hash/invert_spec.rb +12 -0
  132. data/test/core/hash/keep_if_spec.rb +18 -0
  133. data/test/core/hash/key_spec.rb +24 -0
  134. data/test/core/hash/keys_spec.rb +10 -0
  135. data/test/core/hash/length_spec.rb +10 -0
  136. data/test/core/hash/member_spec.rb +24 -0
  137. data/{core/spec → test}/core/hash/merge_spec.rb +0 -0
  138. data/{core/spec → test}/core/hash/new_spec.rb +0 -0
  139. data/test/core/hash/rassoc_spec.rb +34 -0
  140. data/test/core/hash/replace_spec.rb +7 -0
  141. data/test/core/hash/select_spec.rb +52 -0
  142. data/test/core/hash/shift_spec.rb +19 -0
  143. data/test/core/hash/size_spec.rb +10 -0
  144. data/test/core/hash/update_spec.rb +17 -0
  145. data/test/core/hash/value_spec.rb +12 -0
  146. data/test/core/hash/values_at_spec.rb +9 -0
  147. data/test/core/hash/values_spec.rb +7 -0
  148. data/test/core/kernel/eql_spec.rb +15 -0
  149. data/test/core/kernel/equal_value_spec.rb +12 -0
  150. data/test/core/kernel/loop_spec.rb +23 -0
  151. data/test/core/kernel/nil_spec.rb +7 -0
  152. data/test/core/kernel/proc_spec.rb +9 -0
  153. data/test/core/kernel/rand_spec.rb +14 -0
  154. data/test/core/kernel/respond_to_spec.rb +24 -0
  155. data/test/core/kernel/send_spec.rb +56 -0
  156. data/test/core/kernel/tap_spec.rb +10 -0
  157. data/test/core/kernel/to_s_spec.rb +5 -0
  158. data/{core/spec → test}/core/matchdata/to_a_spec.rb +0 -0
  159. data/{core/spec → test}/core/nil/and_spec.rb +0 -0
  160. data/{core/spec → test}/core/nil/inspect_spec.rb +0 -0
  161. data/{core/spec → test}/core/nil/nil_spec.rb +0 -0
  162. data/{core/spec → test}/core/nil/or_spec.rb +0 -0
  163. data/{core/spec → test}/core/nil/to_a_spec.rb +0 -0
  164. data/{core/spec → test}/core/nil/to_f_spec.rb +0 -0
  165. data/{core/spec → test}/core/nil/to_i_spec.rb +0 -0
  166. data/{core/spec → test}/core/nil/to_s_spec.rb +0 -0
  167. data/{core/spec → test}/core/nil/xor_spec.rb +0 -0
  168. data/{core/spec → test}/core/numeric/equal_value_spec.rb +0 -0
  169. data/test/core/range/begin_spec.rb +9 -0
  170. data/test/core/range/case_compare_spec.rb +16 -0
  171. data/test/core/range/end_spec.rb +9 -0
  172. data/{core/spec → test}/core/regexp/match_spec.rb +0 -0
  173. data/test/core/string/capitalize_spec.rb +10 -0
  174. data/test/core/string/casecmp_spec.rb +16 -0
  175. data/test/core/string/chomp_spec.rb +43 -0
  176. data/test/core/string/chop_spec.rb +10 -0
  177. data/test/core/string/chr_spec.rb +13 -0
  178. data/test/core/string/comparison_spec.rb +13 -0
  179. data/test/core/string/downcase_spec.rb +6 -0
  180. data/test/core/string/element_reference_spec.rb +72 -0
  181. data/test/core/string/empty_spec.rb +8 -0
  182. data/test/core/string/end_with_spec.rb +12 -0
  183. data/test/core/string/fixtures/classes.rb +3 -0
  184. data/test/core/string/gsub_spec.rb +17 -0
  185. data/test/core/string/include_spec.rb +12 -0
  186. data/test/core/string/intern_spec.rb +9 -0
  187. data/test/core/string/length_spec.rb +9 -0
  188. data/test/core/string/lstrip_spec.rb +7 -0
  189. data/test/core/string/match_spec.rb +27 -0
  190. data/test/core/string/next_spec.rb +10 -0
  191. data/test/core/string/ord_spec.rb +9 -0
  192. data/test/core/string/partition_spec.rb +10 -0
  193. data/test/core/string/reverse_spec.rb +7 -0
  194. data/test/core/string/rstrip_spec.rb +7 -0
  195. data/test/core/string/size_spec.rb +9 -0
  196. data/test/core/string/slice_spec.rb +72 -0
  197. data/test/core/string/split_spec.rb +5 -0
  198. data/test/core/string/start_with_spec.rb +12 -0
  199. data/test/core/string/strip_spec.rb +6 -0
  200. data/test/core/string/sub_spec.rb +22 -0
  201. data/test/core/string/succ_spec.rb +10 -0
  202. data/test/core/string/sum_spec.rb +5 -0
  203. data/test/core/string/swapcase_spec.rb +18 -0
  204. data/test/core/string/to_a_spec.rb +9 -0
  205. data/test/core/string/to_f_spec.rb +14 -0
  206. data/test/core/string/to_i_spec.rb +25 -0
  207. data/test/core/string/to_s_spec.rb +13 -0
  208. data/test/core/string/to_str_spec.rb +13 -0
  209. data/test/core/string/to_sym_spec.rb +9 -0
  210. data/test/core/string/upcase_spec.rb +6 -0
  211. data/test/core/symbol/to_proc_spec.rb +12 -0
  212. data/{core/spec → test}/core/true/and_spec.rb +0 -0
  213. data/{core/spec → test}/core/true/inspect_spec.rb +0 -0
  214. data/{core/spec → test}/core/true/or_spec.rb +0 -0
  215. data/{core/spec → test}/core/true/to_s_spec.rb +0 -0
  216. data/{core/spec → test}/core/true/xor_spec.rb +0 -0
  217. data/test/index.html +11 -0
  218. data/{core/spec → test}/language/alias_spec.rb +4 -0
  219. data/{core/spec → test}/language/and_spec.rb +0 -0
  220. data/{core/spec → test}/language/array_spec.rb +0 -0
  221. data/{core/spec → test}/language/block_spec.rb +0 -0
  222. data/{core/spec → test}/language/break_spec.rb +0 -0
  223. data/{core/spec → test}/language/case_spec.rb +0 -0
  224. data/{core/spec → test}/language/defined_spec.rb +0 -0
  225. data/{core/spec → test}/language/ensure_spec.rb +0 -0
  226. data/test/language/fixtures/yield.rb +23 -0
  227. data/{core/spec → test}/language/hash_spec.rb +0 -0
  228. data/{core/spec → test}/language/if_spec.rb +0 -0
  229. data/test/language/literal_lambda_spec.rb +47 -0
  230. data/{core/spec → test}/language/loop_spec.rb +0 -0
  231. data/{core/spec → test}/language/metaclass_spec.rb +0 -0
  232. data/{core/spec → test}/language/next_spec.rb +0 -0
  233. data/{core/spec → test}/language/or_spec.rb +0 -0
  234. data/{core/spec → test}/language/predefined_spec.rb +0 -0
  235. data/{core/spec → test}/language/regexp_spec.rb +0 -0
  236. data/{core/spec → test}/language/send_spec.rb +0 -0
  237. data/{core/spec → test}/language/singleton_class_spec.rb +0 -0
  238. data/{core/spec → test}/language/super_spec.rb +0 -0
  239. data/{core/spec → test}/language/symbol_spec.rb +0 -0
  240. data/{core/spec → test}/language/undef_spec.rb +0 -0
  241. data/{core/spec → test}/language/unless_spec.rb +0 -0
  242. data/{core/spec → test}/language/until_spec.rb +0 -0
  243. data/{core/spec → test}/language/variables_spec.rb +0 -0
  244. data/{core/spec → test}/language/while_spec.rb +0 -0
  245. data/test/language/yield_spec.rb +100 -0
  246. data/test/opal/array/subclassing_spec.rb +32 -0
  247. data/test/opal/class/bridge_class_spec.rb +37 -0
  248. data/test/opal/exception/subclassing_spec.rb +17 -0
  249. data/test/opal/runtime/_methods_spec.rb +48 -0
  250. data/test/opal/runtime/class_hierarchy_spec.rb +22 -0
  251. data/test/opal/runtime/def_spec.rb +23 -0
  252. data/test/opal/string/subclassing_spec.rb +26 -0
  253. data/test/spec_helper.rb +3 -0
  254. metadata +437 -111
  255. data/core/spec/core/class/new_spec.rb +0 -16
  256. data/core/spec/core/hash/default_spec.rb +0 -4
  257. data/core/spec/core/symbol/to_proc_spec.rb +0 -6
  258. data/core/spec/index.html +0 -11
  259. data/spec/builder/build_source_spec.rb +0 -52
data/Rakefile CHANGED
@@ -5,27 +5,28 @@ Bundler.setup
5
5
  require 'opal'
6
6
  require 'opal/version'
7
7
 
8
+ Opal::BuilderTask.new do |t|
9
+ t.name = 'opal'
10
+ t.files = []
11
+ t.dependencies = %w[opal-spec]
12
+ t.specs_dir = 'test'
13
+ t.specs_main = 'test/spec_helper'
14
+ end
15
+
8
16
  desc "Build opal.js runtime into ./build"
9
- task :opal do
17
+ task :build do
10
18
  File.open('build/opal.js', 'w+') do |o|
11
19
  o.write Opal::Builder.runtime
12
20
  end
13
21
  end
14
22
 
15
- Opal::BuilderTask.new do |t|
16
- t.name = 'opal'
17
- t.files = []
18
- t.specs_dir = './core/spec'
19
- t.dependencies = %w[opal-spec opal-racc opal-strscan]
20
- end
21
-
22
23
  desc "Check file sizes for opal.js runtime"
23
24
  task :sizes do
24
25
  o = File.read 'build/opal.js'
25
26
  m = uglify o
26
27
  g = gzip m
27
28
 
28
- puts "#{opal.js}:"
29
+ puts "opal.js:"
29
30
  puts "development: #{o.size}, minified: #{m.size}, gzipped: #{g.size}"
30
31
  end
31
32
 
@@ -63,47 +64,4 @@ namespace :gem do
63
64
  task :release do
64
65
  puts "Need to release opal-#{Opal::VERSION}.gem"
65
66
  end
66
- end
67
-
68
- # Documentation
69
- namespace :docs do
70
- task :clone do
71
- if File.exists? 'gh-pages'
72
- Dir.chdir('gh-pages') { sh 'git pull origin gh-pages' }
73
- else
74
- FileUtils.mkdir_p 'gh-pages'
75
- Dir.chdir('gh-pages') do
76
- sh 'git clone git@github.com:/adambeynon/opal.git .'
77
- sh 'git checkout gh-pages'
78
- end
79
- end
80
- end
81
-
82
- task :build do
83
- require 'redcarpet'
84
- require 'albino'
85
-
86
- klass = Class.new(Redcarpet::Render::HTML) do
87
- def block_code(code, language)
88
- Albino.new(code, language || :text).colorize
89
- end
90
- end
91
-
92
- markdown = Redcarpet::Markdown.new(klass, :fenced_code_blocks => true)
93
- sources = %w[index]
94
-
95
- sources.each do |s|
96
- File.open(File.join('gh-pages', "#{s}.html"), 'w+') do |o|
97
- o.write File.read('docs/pre.html')
98
- o.write markdown.render(File.read "docs/#{s}.md")
99
- o.write File.read('docs/post.html')
100
- end
101
- end
102
- end
103
-
104
- task :copy do
105
- FileUtils.cp 'build/opal.js', 'gh-pages/opal.js'
106
- FileUtils.cp 'docs/styles.css', 'gh-pages/styles.css'
107
- FileUtils.cp 'docs/syntax.css', 'gh-pages/syntax.css'
108
- end
109
67
  end
@@ -1,4 +1,8 @@
1
- class Array
1
+ class Array < `Array`
2
+ %x{
3
+ def._isArray = true;
4
+ }
5
+
2
6
  include Enumerable
3
7
 
4
8
  def self.[](*objects)
@@ -11,17 +15,8 @@ class Array
11
15
  }
12
16
  end
13
17
 
14
- def self.allocate
15
- %x{
16
- var array = [];
17
- array._klass = this;
18
-
19
- return array;
20
- }
21
- end
22
-
23
18
  def self.new(*a)
24
- `[]`
19
+ allocate
25
20
  end
26
21
 
27
22
  def &(other)
@@ -119,7 +114,7 @@ class Array
119
114
  var size = this.length;
120
115
 
121
116
  if (typeof index !== 'number') {
122
- if (index._flags & T_RANGE) {
117
+ if (index._isRange) {
123
118
  var exclude = index.exclude;
124
119
  length = index.end;
125
120
  index = index.begin;
@@ -470,7 +465,7 @@ class Array
470
465
  for (var i = 0, length = this.length, item; i < length; i++) {
471
466
  item = this[i];
472
467
 
473
- if (item._flags & T_ARRAY) {
468
+ if (item._isArray) {
474
469
  if (level === undefined) {
475
470
  result = result.concat(#{`item`.flatten});
476
471
  }
@@ -1000,7 +995,7 @@ class Array
1000
995
  result[i] = part;
1001
996
  }
1002
997
 
1003
- if (block) {
998
+ if (block !== nil) {
1004
999
  for (var i = 0; i < size; i++) {
1005
1000
  block.call(__context, result[i]);
1006
1001
  }
@@ -8,8 +8,7 @@ class BasicObject
8
8
 
9
9
  def __send__(symbol, *args, &block)
10
10
  %x{
11
- var meth = this[mid_to_jsid(symbol)] || opal.mm(mid_to_jsid(symbol));
12
- args.unshift(block);
11
+ var meth = this[mid_to_jsid(symbol)];
13
12
 
14
13
  return meth.apply(this, args);
15
14
  }
@@ -22,8 +21,8 @@ class BasicObject
22
21
 
23
22
  def instance_eval(string, &block)
24
23
  %x{
25
- if (block == null) {
26
- throw RubyArgError.$new('block not supplied');
24
+ if (block === nil) {
25
+ no_block_given();
27
26
  }
28
27
 
29
28
  return block.call(this, null, this);
@@ -32,8 +31,8 @@ class BasicObject
32
31
 
33
32
  def instance_exec(*args, &block)
34
33
  %x{
35
- if (block == null) {
36
- throw RubyArgError.$new('block not supplied');
34
+ if (block === nil) {
35
+ no_block_given();
37
36
  }
38
37
 
39
38
  return block.apply(this, args);
@@ -41,9 +40,7 @@ class BasicObject
41
40
  end
42
41
 
43
42
  def method_missing(symbol, *args)
44
- `throw RubyNoMethodError.$new(null, 'undefined method \`' + symbol + '\` for ' + #{inspect});`
45
-
46
- self
43
+ raise NoMethodError, "undefined method `#{symbol}` for #{inspect}"
47
44
  end
48
45
 
49
46
  def singleton_method_added(symbol)
@@ -54,4 +51,4 @@ class BasicObject
54
51
 
55
52
  def singleton_method_undefined(symbol)
56
53
  end
57
- end
54
+ end
@@ -1,4 +1,8 @@
1
- class Boolean
1
+ class Boolean < `Boolean`
2
+ %x{
3
+ def._isBoolean = true;
4
+ }
5
+
2
6
  def &(other)
3
7
  `(this == true) ? (other !== false && other !== nil) : false`
4
8
  end
@@ -2,40 +2,14 @@ class Class
2
2
  def self.new(sup = Object, &block)
3
3
  %x{
4
4
  var klass = boot_class(sup);
5
- klass._name = "AnonClass";
5
+ klass._name = nil;
6
6
 
7
7
  make_metaclass(klass, sup._klass);
8
8
 
9
- #{sup.inherited `klass`};
9
+ sup.$inherited(klass);
10
10
 
11
- if (block !== null) {
12
- block.call(klass, null);
13
- }
14
-
15
- return klass;
16
- }
17
- end
18
-
19
- def bridge_class(constructor)
20
- %x{
21
- var prototype = constructor.prototype,
22
- klass = this;
23
-
24
- klass._alloc = constructor;
25
- klass._proto = prototype;
26
-
27
- bridged_classes.push(klass);
28
-
29
- prototype._klass = klass;
30
- prototype._flags = T_OBJECT;
31
-
32
- var donator = RubyObject._proto;
33
- for (var method in donator) {
34
- if (donator.hasOwnProperty(method)) {
35
- if (!prototype[method]) {
36
- prototype[method] = donator[method];
37
- }
38
- }
11
+ if (block !== nil) {
12
+ block.call(klass);
39
13
  }
40
14
 
41
15
  return klass;
@@ -47,9 +21,12 @@ class Class
47
21
  end
48
22
 
49
23
  def new(*args, &block)
50
- obj = allocate()
51
- obj.initialize *args, &block
52
- obj
24
+ %x{
25
+ var obj = this.$allocate();
26
+ obj._p = block;
27
+ obj.$initialize.apply(obj, args);
28
+ return obj;
29
+ }
53
30
  end
54
31
 
55
32
  def inherited(cls)
@@ -60,22 +37,22 @@ class Class
60
37
  var sup = this._super;
61
38
 
62
39
  if (!sup) {
63
- if (this === RubyObject) {
64
- return null;
40
+ if (this === RubyBasicObject) {
41
+ return nil;
65
42
  }
66
43
 
67
44
  throw RubyRuntimeError.$new('uninitialized class');
68
45
  }
69
46
 
70
- while (sup && (sup._flags & T_ICLASS)) {
47
+ while (sup && (sup._isIClass)) {
71
48
  sup = sup._super;
72
49
  }
73
50
 
74
51
  if (!sup) {
75
- return null;
52
+ return nil;
76
53
  }
77
54
 
78
55
  return sup;
79
56
  }
80
57
  end
81
- end
58
+ end
@@ -0,0 +1,89 @@
1
+ class Dir
2
+ def self.getwd
3
+ ""
4
+ end
5
+
6
+ def self.pwd
7
+ ""
8
+ end
9
+
10
+ def self.[](*globs)
11
+ %x{
12
+ var result = [], files = factories;
13
+
14
+ for (var i = 0, ii = globs.length; i < ii; i++) {
15
+ var glob = globs[i];
16
+
17
+ var re = fs_glob_to_regexp(#{ File.expand_path `glob` });
18
+
19
+ for (var file in files) {
20
+ if (re.exec(file)) {
21
+ result.push(file);
22
+ }
23
+ }
24
+ }
25
+
26
+ return result;
27
+ }
28
+ end
29
+
30
+ %x(
31
+ function fs_glob_to_regexp(glob) {
32
+ var parts = glob.split(''),
33
+ length = parts.length,
34
+ result = '';
35
+
36
+ var opt_group_stack = 0;
37
+
38
+ for (var i = 0; i < length; i++) {
39
+ var cur = parts[i];
40
+
41
+ switch (cur) {
42
+ case '*':
43
+ if (parts[i + 1] === '*' && parts[i + 2] === '/') {
44
+ result += '.*';
45
+ i += 2;
46
+ }
47
+ else {
48
+ result += '[^/]*';
49
+ }
50
+ break;
51
+
52
+ case '.':
53
+ result += '\\\\';
54
+ result += cur;
55
+ break;
56
+
57
+ case ',':
58
+ if (opt_group_stack) {
59
+ result += '|';
60
+ }
61
+ else {
62
+ result += ',';
63
+ }
64
+ break;
65
+
66
+ case '{':
67
+ result += '(';
68
+ opt_group_stack++;
69
+ break;
70
+
71
+ case '}':
72
+ if (opt_group_stack) {
73
+ result += ')';
74
+ opt_group_stack--;
75
+ }
76
+ else {
77
+ result += '}'
78
+ }
79
+ break;
80
+
81
+ default:
82
+ result += cur;
83
+ }
84
+ }
85
+
86
+ return new RegExp('^' + result + '$');
87
+ }
88
+ )
89
+ end
@@ -3,7 +3,7 @@ module Enumerable
3
3
  %x{
4
4
  var result = true, proc;
5
5
 
6
- if (block) {
6
+ if (block !== nil) {
7
7
  proc = function(obj) {
8
8
  var value;
9
9
 
@@ -41,7 +41,7 @@ module Enumerable
41
41
  %x{
42
42
  var result = false, proc;
43
43
 
44
- if (block) {
44
+ if (block !== nil) {
45
45
  proc = function(obj) {
46
46
  var value;
47
47
 
@@ -102,7 +102,7 @@ module Enumerable
102
102
  %x{
103
103
  var result = 0;
104
104
 
105
- if (!block) {
105
+ if (block === nil) {
106
106
  if (object == null) {
107
107
  block = function() { return true; };
108
108
  }
@@ -136,20 +136,22 @@ module Enumerable
136
136
  %x{
137
137
  var result = nil;
138
138
 
139
- this.$each(function(y, obj) {
139
+ this.$each._p = function(obj) {
140
140
  var value;
141
141
 
142
- if ((value = $yield.call($context, null, obj)) === $breaker) {
143
- return $breaker.$v;
142
+ if ((value = block.call(__context, obj)) === __breaker) {
143
+ return __breaker.$v;
144
144
  }
145
145
 
146
146
  if (value !== false && value !== nil) {
147
147
  result = obj;
148
- $breaker.$v = nil;
148
+ __breaker.$v = nil;
149
149
 
150
- return $breaker;
150
+ return __breaker;
151
151
  }
152
- });
152
+ };
153
+
154
+ this.$each();
153
155
 
154
156
  if (result !== nil) {
155
157
  return result;
@@ -164,19 +166,19 @@ module Enumerable
164
166
  end
165
167
 
166
168
  def drop(number)
167
- raise NotImplementedError
168
-
169
169
  %x{
170
170
  var result = [],
171
171
  current = 0;
172
172
 
173
- this.$each(function(y, obj) {
173
+ this.$each._p = function(obj) {
174
174
  if (number < current) {
175
175
  result.push(e);
176
176
  }
177
177
 
178
178
  current++;
179
- });
179
+ };
180
+
181
+ this.$each();
180
182
 
181
183
  return result;
182
184
  }
@@ -188,18 +190,18 @@ module Enumerable
188
190
  %x{
189
191
  var result = [];
190
192
 
191
- this.$each.$P = function(y, obj) {
193
+ this.$each._p = function(obj) {
192
194
  var value;
193
195
 
194
- if ((value = $yield.call($context, null, obj)) === $breaker) {
195
- return $breaker.$v;
196
+ if ((value = block.call(__context, obj)) === __breaker) {
197
+ return __breaker;
196
198
  }
197
199
 
198
200
  if (value !== false && value !== nil) {
199
201
  result.push(obj);
200
202
  }
201
203
  else {
202
- return $breaker;
204
+ return __breaker;
203
205
  }
204
206
  };
205
207
 
@@ -215,56 +217,120 @@ module Enumerable
215
217
  %x{
216
218
  var index = 0;
217
219
 
218
- this.$each(function(y, obj) {
220
+ this.$each._p = function(obj) {
219
221
  var value;
220
222
 
221
- if ((value = $yield.call($context, null, obj, index)) === $breaker) {
222
- return $breaker.$v;
223
+ if ((value = block.call(__context, obj, index)) === __breaker) {
224
+ return __breaker.$v;
223
225
  }
224
226
 
225
227
  index++;
226
- });
228
+ };
229
+
230
+ this.$each();
227
231
 
228
232
  return nil;
229
233
  }
230
234
  end
231
235
 
232
- def entries
233
- result = []
236
+ def each_with_object(object, &block)
237
+ return enum_for :each_with_object unless block
238
+
239
+ %x{
240
+ this.$each._p = function(obj) {
241
+ var value;
242
+
243
+ if ((value = block.call(__context, obj, object)) === __breaker) {
244
+ return __breaker.$v;
245
+ }
246
+ };
234
247
 
235
- each {|*args|
236
- result.push args.length == 1 ? args.first : args
248
+ this.$each();
249
+
250
+ return object;
237
251
  }
252
+ end
253
+
254
+ def entries
255
+ %x{
256
+ var result = [];
257
+
258
+ this.$each._p = function(obj) {
259
+ result.push(obj);
260
+ };
261
+
262
+ this.$each();
238
263
 
239
- result
264
+ return result;
265
+ }
240
266
  end
241
267
 
242
268
  alias find detect
243
269
 
244
- def find_index(object = undefined, &block)
245
- return enum_for :find_index, object unless block
270
+ def find_all(&block)
271
+ return enum_for :find_all unless block
246
272
 
247
273
  %x{
248
- if (object !== undefined) {
249
- $yield = function (y, obj) { return obj.$eq$(null, object); };
250
- }
251
-
252
- var result = nil;
274
+ var result = [];
253
275
 
254
- this.$each_with_index(function(y, obj, index) {
276
+ this.$each._p = function(obj) {
255
277
  var value;
256
278
 
257
- if ((value = $yield.call($context, null, obj)) === $breaker) {
258
- return $breaker.$v;
279
+ if ((value = block.call(__context, obj)) === __breaker) {
280
+ return __breaker.$v;
259
281
  }
260
282
 
261
283
  if (value !== false && value !== nil) {
262
- result = obj;
263
- breaker.$v = index;
284
+ //result = obj;
285
+ //__breaker.$v = nil;
264
286
 
265
- return $breaker;
287
+ //return __breaker;
288
+ result.push(obj);
266
289
  }
267
- });
290
+ };
291
+
292
+ this.$each();
293
+
294
+ return result;
295
+ }
296
+ end
297
+
298
+ def find_index(object = undefined, &block)
299
+ %x{
300
+ var proc, result = nil, index = 0;
301
+
302
+ if (object != null) {
303
+ proc = function (obj) {
304
+ if (obj.$eq$(object)) {
305
+ result = index;
306
+ return __breaker;
307
+ }
308
+ index += 1;
309
+ };
310
+ }
311
+ else if (block === nil) {
312
+ return this.$enum_for("find_index");
313
+ } else {
314
+ proc = function(obj) {
315
+ var value;
316
+
317
+ if ((value = block.call(__context, obj)) === __breaker) {
318
+ return __breaker.$v;
319
+ }
320
+
321
+ if (value !== false && value !== nil) {
322
+ result = index;
323
+ __breaker.$v = index;
324
+
325
+ return __breaker;
326
+ }
327
+ index += 1;
328
+ };
329
+ }
330
+
331
+ this.$each._p = proc;
332
+
333
+ this.$each();
268
334
 
269
335
  return result;
270
336
  }
@@ -273,21 +339,29 @@ module Enumerable
273
339
  def first(number = undefined)
274
340
  %x{
275
341
  var result = [],
276
- current = 0;
342
+ current = 0,
343
+ proc;
277
344
 
278
- this.$each(number === undefined
279
- ? function(y, obj) {
280
- result = obj; return $breaker;
281
- }
282
- : function(y, obj) {
345
+ if (number == null) {
346
+ result = nil;
347
+ proc = function(obj) {
348
+ result = obj; return __breaker;
349
+ };
350
+ } else {
351
+ proc = function(obj) {
283
352
  if (number <= current) {
284
- return $breaker;
353
+ return __breaker;
285
354
  }
286
355
 
287
356
  result.push(obj);
288
357
 
289
358
  current++;
290
- });
359
+ };
360
+ }
361
+
362
+ this.$each._p = proc;
363
+
364
+ this.$each();
291
365
 
292
366
  return result;
293
367
  }
@@ -297,26 +371,28 @@ module Enumerable
297
371
  %x{
298
372
  var result = [];
299
373
 
300
- this.$each(block !== nil
301
- ? function(y, obj) {
302
- var value = pattern.$eqq$(null, obj);
374
+ this.$each._p = (block !== nil
375
+ ? function(obj) {
376
+ var value = pattern.$eqq$(obj);
303
377
 
304
378
  if (value !== false && value !== nil) {
305
- if ((value = $yield.call($context, null, obj)) === $breaker) {
306
- return $breaker.$v;
379
+ if ((value = block.call(__context, obj)) === __breaker) {
380
+ return __breaker.$v;
307
381
  }
308
382
 
309
- result.push(obj);
383
+ result.push(value);
310
384
  }
311
385
  }
312
- : function(y, obj) {
313
- var value = pattern.$eqq$(null, obj);
386
+ : function(obj) {
387
+ var value = pattern.$eqq$(obj);
314
388
 
315
389
  if (value !== false && value !== nil) {
316
- ary.push(obj);
390
+ result.push(obj);
317
391
  }
318
392
  });
319
393
 
394
+ this.$each();
395
+
320
396
  return result;
321
397
  }
322
398
  end