opal 0.3.18 → 0.3.19

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 (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