opal 0.3.21 → 0.3.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (297) hide show
  1. data/.travis.yml +1 -4
  2. data/Gemfile +9 -4
  3. data/README.md +10 -589
  4. data/Rakefile +51 -19
  5. data/config.ru +17 -0
  6. data/core/array.rb +42 -34
  7. data/core/basic_object.rb +4 -4
  8. data/core/browser.js +31 -0
  9. data/core/class.rb +7 -7
  10. data/core/enumerable.rb +65 -69
  11. data/core/erb.rb +30 -0
  12. data/core/error.rb +2 -3
  13. data/core/hash.rb +47 -18
  14. data/core/kernel.rb +15 -16
  15. data/core/load_order +2 -1
  16. data/core/module.rb +19 -37
  17. data/core/numeric.rb +4 -2
  18. data/core/object.rb +4 -0
  19. data/core/proc.rb +6 -3
  20. data/core/racc.rb +215 -0
  21. data/core/regexp.rb +16 -21
  22. data/core/runtime.js +141 -153
  23. data/core/string.rb +41 -19
  24. data/core/strscan.rb +61 -0
  25. data/core/time.rb +1 -5
  26. data/docs/index.md +616 -0
  27. data/docs/post.html +2 -8
  28. data/docs/pre.html +29 -26
  29. data/docs/try.html +52 -0
  30. data/lib/opal.rb +33 -3
  31. data/lib/opal/builder.rb +14 -34
  32. data/lib/opal/erb_parser.rb +19 -0
  33. data/lib/opal/grammar.rb +7 -3
  34. data/lib/opal/grammar.y +3 -0
  35. data/lib/opal/lexer.rb +16 -8
  36. data/lib/opal/parser.rb +156 -119
  37. data/lib/opal/rake_task.rb +2 -2
  38. data/lib/opal/scope.rb +9 -10
  39. data/lib/opal/version.rb +1 -1
  40. data/{test → spec}/core/array/allocate_spec.rb +0 -0
  41. data/{test → spec}/core/array/append_spec.rb +0 -0
  42. data/{test → spec}/core/array/assoc_spec.rb +0 -0
  43. data/{test → spec}/core/array/at_spec.rb +0 -0
  44. data/{test → spec}/core/array/clear_spec.rb +0 -0
  45. data/{test → spec}/core/array/clone_spec.rb +0 -0
  46. data/{test → spec}/core/array/collect_spec.rb +0 -0
  47. data/{test → spec}/core/array/compact_spec.rb +0 -0
  48. data/{test → spec}/core/array/concat_spec.rb +0 -0
  49. data/{test → spec}/core/array/constructor_spec.rb +0 -0
  50. data/{test → spec}/core/array/count_spec.rb +0 -0
  51. data/{test → spec}/core/array/delete_at_spec.rb +0 -0
  52. data/{test → spec}/core/array/delete_if_spec.rb +0 -0
  53. data/{test → spec}/core/array/delete_spec.rb +0 -0
  54. data/{test → spec}/core/array/each_index_spec.rb +0 -0
  55. data/{test → spec}/core/array/each_spec.rb +0 -0
  56. data/{test → spec}/core/array/element_reference_spec.rb +0 -0
  57. data/{test → spec}/core/array/empty_spec.rb +0 -0
  58. data/{test → spec}/core/array/eql_spec.rb +0 -0
  59. data/{test → spec}/core/array/fetch_spec.rb +0 -0
  60. data/{test → spec}/core/array/first_spec.rb +0 -0
  61. data/{test → spec}/core/array/flatten_spec.rb +0 -0
  62. data/{test → spec}/core/array/include_spec.rb +0 -0
  63. data/{test → spec}/core/array/insert_spec.rb +0 -0
  64. data/{test → spec}/core/array/last_spec.rb +0 -0
  65. data/{test → spec}/core/array/length_spec.rb +0 -0
  66. data/{test → spec}/core/array/map_spec.rb +0 -0
  67. data/{test → spec}/core/array/minus_spec.rb +0 -0
  68. data/{test → spec}/core/array/plus_spec.rb +0 -0
  69. data/{test → spec}/core/array/pop_spec.rb +0 -0
  70. data/{test → spec}/core/array/push_spec.rb +0 -0
  71. data/{test → spec}/core/array/rassoc_spec.rb +0 -0
  72. data/{test → spec}/core/array/reject_spec.rb +0 -0
  73. data/{test → spec}/core/array/replace_spec.rb +0 -0
  74. data/{test → spec}/core/array/reverse_each_spec.rb +0 -0
  75. data/{test → spec}/core/array/reverse_spec.rb +0 -0
  76. data/{test → spec}/core/array/size_spec.rb +0 -0
  77. data/{test → spec}/core/array/to_ary_spec.rb +0 -0
  78. data/{test → spec}/core/array/uniq_spec.rb +0 -0
  79. data/{test → spec}/core/array/zip_spec.rb +0 -0
  80. data/{test → spec}/core/class/fixtures/classes.rb +0 -0
  81. data/{test → spec}/core/class/new_spec.rb +3 -0
  82. data/{test → spec}/core/enumerable/all_spec.rb +3 -0
  83. data/{test → spec}/core/enumerable/any_spec.rb +0 -0
  84. data/{test → spec}/core/enumerable/collect_spec.rb +0 -0
  85. data/{test → spec}/core/enumerable/count_spec.rb +0 -0
  86. data/{test → spec}/core/enumerable/detect_spec.rb +0 -0
  87. data/{test → spec}/core/enumerable/drop_spec.rb +0 -0
  88. data/{test → spec}/core/enumerable/drop_while_spec.rb +0 -0
  89. data/{test → spec}/core/enumerable/each_with_index_spec.rb +0 -0
  90. data/{test → spec}/core/enumerable/each_with_object_spec.rb +0 -0
  91. data/{test → spec}/core/enumerable/entries_spec.rb +0 -0
  92. data/{test → spec}/core/enumerable/find_all_spec.rb +0 -0
  93. data/{test → spec}/core/enumerable/find_index_spec.rb +0 -0
  94. data/{test → spec}/core/enumerable/find_spec.rb +0 -0
  95. data/{test → spec}/core/enumerable/first_spec.rb +0 -0
  96. data/{test → spec}/core/enumerable/fixtures/classes.rb +0 -0
  97. data/{test → spec}/core/enumerable/grep_spec.rb +0 -0
  98. data/{test → spec}/core/enumerable/take_spec.rb +0 -0
  99. data/{test → spec}/core/enumerable/to_a_spec.rb +0 -0
  100. data/{test → spec}/core/false/and_spec.rb +0 -0
  101. data/{test → spec}/core/false/inspect_spec.rb +0 -0
  102. data/{test → spec}/core/false/or_spec.rb +0 -0
  103. data/{test → spec}/core/false/to_s_spec.rb +0 -0
  104. data/{test → spec}/core/false/xor_spec.rb +0 -0
  105. data/{test → spec}/core/hash/allocate_spec.rb +0 -0
  106. data/{test → spec}/core/hash/assoc_spec.rb +0 -0
  107. data/{test → spec}/core/hash/clear_spec.rb +0 -0
  108. data/{test → spec}/core/hash/clone_spec.rb +0 -0
  109. data/{test → spec}/core/hash/default_spec.rb +0 -0
  110. data/{test → spec}/core/hash/delete_if_spec.rb +0 -0
  111. data/{test → spec}/core/hash/each_key_spec.rb +0 -0
  112. data/{test → spec}/core/hash/each_pair_spec.rb +0 -0
  113. data/{test → spec}/core/hash/each_spec.rb +0 -0
  114. data/{test → spec}/core/hash/each_value_spec.rb +0 -0
  115. data/{test → spec}/core/hash/element_reference_spec.rb +14 -1
  116. data/{test → spec}/core/hash/element_set_spec.rb +0 -0
  117. data/{test → spec}/core/hash/empty_spec.rb +0 -0
  118. data/{test → spec}/core/hash/fetch_spec.rb +0 -0
  119. data/{test → spec}/core/hash/flatten_spec.rb +0 -0
  120. data/{test → spec}/core/hash/has_key_spec.rb +0 -0
  121. data/{test → spec}/core/hash/has_value_spec.rb +0 -0
  122. data/{test → spec}/core/hash/include_spec.rb +0 -0
  123. data/{test → spec}/core/hash/index_spec.rb +0 -0
  124. data/{test → spec}/core/hash/indexes_spec.rb +0 -0
  125. data/{test → spec}/core/hash/indices_spec.rb +0 -0
  126. data/{test → spec}/core/hash/invert_spec.rb +0 -0
  127. data/{test → spec}/core/hash/keep_if_spec.rb +0 -0
  128. data/{test → spec}/core/hash/key_spec.rb +0 -0
  129. data/{test → spec}/core/hash/keys_spec.rb +0 -0
  130. data/{test → spec}/core/hash/length_spec.rb +0 -0
  131. data/{test → spec}/core/hash/member_spec.rb +0 -0
  132. data/{test → spec}/core/hash/merge_spec.rb +0 -0
  133. data/{test → spec}/core/hash/new_spec.rb +8 -0
  134. data/{test → spec}/core/hash/rassoc_spec.rb +0 -0
  135. data/{test → spec}/core/hash/replace_spec.rb +0 -0
  136. data/{test → spec}/core/hash/select_spec.rb +0 -0
  137. data/{test → spec}/core/hash/shift_spec.rb +0 -0
  138. data/{test → spec}/core/hash/size_spec.rb +0 -0
  139. data/{test → spec}/core/hash/update_spec.rb +0 -0
  140. data/{test → spec}/core/hash/value_spec.rb +0 -0
  141. data/{test → spec}/core/hash/values_at_spec.rb +0 -0
  142. data/{test → spec}/core/hash/values_spec.rb +0 -0
  143. data/{test → spec}/core/kernel/define_singleton_method_spec.rb +0 -0
  144. data/{test → spec}/core/kernel/eql_spec.rb +0 -0
  145. data/{test → spec}/core/kernel/equal_value_spec.rb +0 -0
  146. data/{test → spec}/core/kernel/loop_spec.rb +0 -0
  147. data/{test → spec}/core/kernel/nil_spec.rb +0 -0
  148. data/{test → spec}/core/kernel/proc_spec.rb +4 -0
  149. data/{test → spec}/core/kernel/rand_spec.rb +0 -0
  150. data/{test → spec}/core/kernel/respond_to_spec.rb +0 -0
  151. data/{test → spec}/core/kernel/send_spec.rb +0 -0
  152. data/{test → spec}/core/kernel/tap_spec.rb +0 -0
  153. data/{test → spec}/core/kernel/to_s_spec.rb +0 -0
  154. data/{test → spec}/core/matchdata/to_a_spec.rb +0 -0
  155. data/{test → spec}/core/nil/and_spec.rb +0 -0
  156. data/{test → spec}/core/nil/inspect_spec.rb +0 -0
  157. data/{test → spec}/core/nil/nil_spec.rb +0 -0
  158. data/{test → spec}/core/nil/or_spec.rb +0 -0
  159. data/{test → spec}/core/nil/to_a_spec.rb +0 -0
  160. data/{test → spec}/core/nil/to_f_spec.rb +0 -0
  161. data/{test → spec}/core/nil/to_i_spec.rb +0 -0
  162. data/{test → spec}/core/nil/to_s_spec.rb +0 -0
  163. data/{test → spec}/core/nil/xor_spec.rb +0 -0
  164. data/{test → spec}/core/numeric/equal_value_spec.rb +0 -0
  165. data/spec/core/proc/proc_tricks_spec.rb +7 -0
  166. data/{test → spec}/core/range/begin_spec.rb +0 -0
  167. data/{test → spec}/core/range/case_compare_spec.rb +0 -0
  168. data/{test → spec}/core/range/end_spec.rb +0 -0
  169. data/{test → spec}/core/regexp/match_spec.rb +0 -0
  170. data/{test → spec}/core/string/capitalize_spec.rb +0 -0
  171. data/{test → spec}/core/string/casecmp_spec.rb +0 -0
  172. data/{test → spec}/core/string/chomp_spec.rb +0 -0
  173. data/{test → spec}/core/string/chop_spec.rb +0 -0
  174. data/{test → spec}/core/string/chr_spec.rb +0 -0
  175. data/{test → spec}/core/string/comparison_spec.rb +0 -0
  176. data/{test → spec}/core/string/downcase_spec.rb +0 -0
  177. data/{test → spec}/core/string/element_reference_spec.rb +14 -2
  178. data/{test → spec}/core/string/empty_spec.rb +0 -0
  179. data/{test → spec}/core/string/end_with_spec.rb +0 -0
  180. data/{test → spec}/core/string/fixtures/classes.rb +0 -0
  181. data/{test → spec}/core/string/gsub_spec.rb +0 -0
  182. data/{test → spec}/core/string/include_spec.rb +0 -0
  183. data/{test → spec}/core/string/intern_spec.rb +0 -0
  184. data/{test → spec}/core/string/length_spec.rb +0 -0
  185. data/{test → spec}/core/string/lstrip_spec.rb +0 -0
  186. data/{test → spec}/core/string/match_spec.rb +0 -0
  187. data/{test → spec}/core/string/next_spec.rb +0 -0
  188. data/{test → spec}/core/string/ord_spec.rb +0 -0
  189. data/{test → spec}/core/string/partition_spec.rb +0 -0
  190. data/{test → spec}/core/string/reverse_spec.rb +0 -0
  191. data/{test → spec}/core/string/rstrip_spec.rb +0 -0
  192. data/{test → spec}/core/string/size_spec.rb +0 -0
  193. data/{test → spec}/core/string/slice_spec.rb +4 -1
  194. data/{test → spec}/core/string/split_spec.rb +0 -0
  195. data/{test → spec}/core/string/start_with_spec.rb +0 -0
  196. data/{test → spec}/core/string/strip_spec.rb +0 -0
  197. data/{test → spec}/core/string/sub_spec.rb +0 -0
  198. data/{test → spec}/core/string/succ_spec.rb +0 -0
  199. data/{test → spec}/core/string/sum_spec.rb +0 -0
  200. data/{test → spec}/core/string/swapcase_spec.rb +0 -0
  201. data/{test → spec}/core/string/to_a_spec.rb +0 -0
  202. data/{test → spec}/core/string/to_f_spec.rb +0 -0
  203. data/{test → spec}/core/string/to_i_spec.rb +0 -0
  204. data/{test → spec}/core/string/to_s_spec.rb +0 -0
  205. data/{test → spec}/core/string/to_str_spec.rb +0 -0
  206. data/{test → spec}/core/string/to_sym_spec.rb +0 -0
  207. data/{test → spec}/core/string/upcase_spec.rb +0 -0
  208. data/{test → spec}/core/symbol/to_proc_spec.rb +0 -0
  209. data/{test → spec}/core/time/at_spec.rb +0 -0
  210. data/{test → spec}/core/time/day_spec.rb +0 -0
  211. data/{test → spec}/core/time/friday_spec.rb +0 -0
  212. data/{test → spec}/core/time/hour_spec.rb +0 -0
  213. data/{test → spec}/core/time/min_spec.rb +0 -0
  214. data/{test → spec}/core/time/monday_spec.rb +0 -0
  215. data/{test → spec}/core/time/month_spec.rb +0 -0
  216. data/{test → spec}/core/time/now_spec.rb +0 -0
  217. data/{test → spec}/core/time/saturday_spec.rb +0 -0
  218. data/{test → spec}/core/true/and_spec.rb +0 -0
  219. data/{test → spec}/core/true/inspect_spec.rb +0 -0
  220. data/{test → spec}/core/true/or_spec.rb +0 -0
  221. data/{test → spec}/core/true/to_s_spec.rb +0 -0
  222. data/{test → spec}/core/true/xor_spec.rb +0 -0
  223. data/spec/grammar/lvar_spec.rb +2 -1
  224. data/spec/grammar/str_spec.rb +1 -1
  225. data/spec/grammar/xstr_spec.rb +1 -1
  226. data/{test → spec}/index.html +3 -3
  227. data/{test → spec}/language/alias_spec.rb +0 -0
  228. data/{test → spec}/language/and_spec.rb +0 -0
  229. data/{test → spec}/language/array_spec.rb +0 -0
  230. data/{test → spec}/language/block_spec.rb +0 -0
  231. data/{test → spec}/language/break_spec.rb +0 -0
  232. data/{test → spec}/language/case_spec.rb +0 -0
  233. data/{test → spec}/language/defined_spec.rb +0 -0
  234. data/{test → spec}/language/ensure_spec.rb +2 -2
  235. data/{test → spec}/language/fixtures/next.rb +0 -0
  236. data/{test → spec}/language/fixtures/yield.rb +0 -0
  237. data/{test → spec}/language/hash_spec.rb +0 -0
  238. data/{test → spec}/language/if_spec.rb +0 -0
  239. data/{test → spec}/language/literal_lambda_spec.rb +0 -0
  240. data/{test → spec}/language/loop_spec.rb +0 -0
  241. data/{test → spec}/language/metaclass_spec.rb +0 -0
  242. data/{test → spec}/language/next_spec.rb +2 -0
  243. data/{test → spec}/language/or_spec.rb +0 -0
  244. data/{test → spec}/language/predefined_spec.rb +0 -0
  245. data/{test → spec}/language/regexp_spec.rb +0 -0
  246. data/{test → spec}/language/send_spec.rb +0 -0
  247. data/{test → spec}/language/singleton_class_spec.rb +0 -0
  248. data/{test → spec}/language/super_spec.rb +0 -0
  249. data/{test → spec}/language/symbol_spec.rb +0 -0
  250. data/{test → spec}/language/undef_spec.rb +0 -0
  251. data/{test → spec}/language/unless_spec.rb +0 -0
  252. data/{test → spec}/language/until_spec.rb +0 -0
  253. data/{test → spec}/language/variables_spec.rb +0 -0
  254. data/{test → spec}/language/while_spec.rb +0 -0
  255. data/{test → spec}/language/yield_spec.rb +2 -0
  256. data/{test → spec}/opal/array/subclassing_spec.rb +0 -0
  257. data/{test → spec}/opal/array/to_json_spec.rb +0 -0
  258. data/{test → spec}/opal/boolean/singleton_class_spec.rb +0 -0
  259. data/{test → spec}/opal/boolean/to_json_spec.rb +0 -0
  260. data/{test → spec}/opal/class/bridge_class_spec.rb +0 -0
  261. data/spec/opal/erb/erb_spec.rb +15 -0
  262. data/{test → spec}/opal/exception/subclassing_spec.rb +0 -0
  263. data/{test → spec}/opal/hash/to_json_spec.rb +0 -0
  264. data/spec/opal/hash/to_native_spec.rb +5 -0
  265. data/{test → spec}/opal/json/parse_spec.rb +0 -0
  266. data/{test → spec}/opal/kernel/to_json_spec.rb +0 -0
  267. data/{test → spec}/opal/nil/to_json_spec.rb +0 -0
  268. data/{test → spec}/opal/numeric/to_json_spec.rb +0 -0
  269. data/{test → spec}/opal/runtime/call_spec.rb +0 -0
  270. data/{test → spec}/opal/runtime/class_hierarchy_spec.rb +0 -0
  271. data/{test → spec}/opal/runtime/def_spec.rb +0 -0
  272. data/{test → spec}/opal/runtime/defined_spec.rb +0 -0
  273. data/{test → spec}/opal/runtime/method_missing_spec.rb +3 -3
  274. data/{test → spec}/opal/runtime/super_spec.rb +0 -0
  275. data/{test → spec}/opal/string/subclassing_spec.rb +0 -0
  276. data/{test → spec}/opal/string/to_json_spec.rb +0 -0
  277. data/spec/opal/strscan/check_spec.rb +13 -0
  278. data/spec/opal/strscan/scan_spec.rb +33 -0
  279. data/spec/parser/simple_spec.rb +44 -0
  280. data/spec/spec_helper.rb +7 -7
  281. metadata +487 -497
  282. data/core/dir.rb +0 -89
  283. data/core/file.rb +0 -85
  284. data/spec/browser_spec.rb +0 -28
  285. data/spec/builder/fixtures/build_source/adam.rb +0 -0
  286. data/spec/builder/fixtures/build_source/bar/a.rb +0 -0
  287. data/spec/builder/fixtures/build_source/bar/wow/b.rb +0 -0
  288. data/spec/builder/fixtures/build_source/bar/wow/cow/c.rb +0 -0
  289. data/spec/builder/fixtures/build_source/beynon.rb +0 -0
  290. data/spec/builder/fixtures/build_source/charles.js +0 -0
  291. data/spec/builder/fixtures/build_source/foo/a.rb +0 -0
  292. data/spec/builder/fixtures/build_source/foo/b.rb +0 -0
  293. data/spec/builder/fixtures/build_source/foo/x.js +0 -0
  294. data/spec/builder/fixtures/build_source/foo/y.js +0 -0
  295. data/spec/builder/lib_name_for_spec.rb +0 -19
  296. data/test/index.min.html +0 -12
  297. data/test/spec_helper.rb +0 -4
data/core/object.rb CHANGED
@@ -14,4 +14,8 @@ class Object
14
14
  def singleton_methods
15
15
  []
16
16
  end
17
+
18
+ # hack to make bridged classes get basicobject methods
19
+ alias __send__ __send__
20
+ alias send send
17
21
  end
data/core/proc.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  class Proc < `Function`
2
2
  %x{
3
3
  Proc_prototype._isProc = true;
4
+ Proc_prototype.is_lambda = true;
4
5
  }
5
6
 
6
7
  def self.new(&block)
7
8
  `if (block === nil) no_block_given();`
8
-
9
+ `block.is_lambda = false`
9
10
  block
10
11
  end
11
12
 
@@ -14,7 +15,7 @@ class Proc < `Function`
14
15
  end
15
16
 
16
17
  def call(*args)
17
- `#{self}.apply(null, [#{self}._s].concat(#{args}))`
18
+ `#{self}.apply(#{self}._s, #{args})`
18
19
  end
19
20
 
20
21
  def to_proc
@@ -22,7 +23,9 @@ class Proc < `Function`
22
23
  end
23
24
 
24
25
  def lambda?
25
- `!!this.$lambda`
26
+ # This method should tell the user if the proc tricks are unavailable,
27
+ # (see Proc#lambda? on ruby docs to find out more).
28
+ `!!#{self}.is_lambda`
26
29
  end
27
30
 
28
31
  def arity
data/core/racc.rb ADDED
@@ -0,0 +1,215 @@
1
+ # Opal port of racc/parser.rb.
2
+ #
3
+ # Original license:
4
+ #
5
+ # $originalId: parser.rb,v 1.8 2006/07/06 11:42:07 aamine Exp $
6
+ #
7
+ # Copyright (c) 1999-2006 Minero Aoki
8
+ #
9
+ # This program is free software.
10
+ # You can distribute/modify this program under the same terms of ruby.
11
+ #
12
+ # As a special exception, when this code is copied by Racc
13
+ # into a Racc output file, you may use that output file
14
+ # without restriction.
15
+ module Racc
16
+
17
+ class Parser
18
+
19
+ def _racc_setup
20
+ self.class::Racc_arg
21
+ end
22
+
23
+ def do_parse
24
+ _racc_do_parse_rb _racc_setup, false
25
+ end
26
+
27
+ def _racc_do_parse_rb(arg, in_debug)
28
+ action_table = arg[0]
29
+ action_check = arg[1]
30
+ action_default = arg[2]
31
+ action_pointer = arg[3]
32
+
33
+ goto_table = arg[4]
34
+ goto_check = arg[5]
35
+ goto_default = arg[6]
36
+ goto_pointer = arg[7]
37
+
38
+ nt_base = arg[8]
39
+ reduce_table = arg[9]
40
+ token_table = arg[10]
41
+ shift_n = arg[11]
42
+ reduce_n = arg[12]
43
+
44
+ use_result = arg[13]
45
+
46
+ # racc sys vars
47
+ racc_state = [0]
48
+ racc_tstack = []
49
+ racc_vstack = []
50
+
51
+ racc_t = nil
52
+ racc_tok = nil
53
+ racc_val = nil
54
+ racc_read_next = true
55
+
56
+ racc_user_yyerror = false
57
+ racc_error_status = 0
58
+
59
+ token = nil; act = nil; i = nil; nerr = nil; custate = nil
60
+
61
+ while true
62
+ i = action_pointer[racc_state[-1]]
63
+
64
+ if i
65
+ if racc_read_next
66
+ if racc_t != 0 # not EOF
67
+ token = next_token
68
+
69
+ racc_tok = token[0]
70
+ racc_val = token[1]
71
+
72
+ if racc_tok == false # EOF
73
+ racc_t = 0
74
+ else
75
+ racc_t = token_table[racc_tok]
76
+ racc_t = 1 unless racc_t
77
+ # racc_t ||= 1
78
+ end
79
+
80
+ racc_read_token(racc_t, racc_tok, racc_val) if @yydebug
81
+ racc_read_next = false
82
+ end
83
+ end
84
+
85
+ i += racc_t
86
+
87
+ if (i < 0) || (act = action_table[i]).nil? || (action_check[i] != racc_state[-1])
88
+ act = action_default[racc_state[-1]]
89
+ end
90
+
91
+ else
92
+ act = action_default[racc_state[-1]]
93
+ end
94
+
95
+ puts "(act: #{act}, shift_n: #{shift_n}, reduce_n: #{reduce_n})" if @yydebug
96
+ if act > 0 && act < shift_n
97
+ if racc_error_status > 0
98
+ if racc_t != 1
99
+ racc_error_status -= 1
100
+ end
101
+ end
102
+
103
+ racc_vstack.push racc_val
104
+ curstate = act
105
+ racc_state << act
106
+ racc_read_next = true
107
+
108
+ if @yydebug
109
+ racc_tstack.push racc_t
110
+ racc_shift racc_t, racc_tstack, racc_vstack
111
+ end
112
+
113
+ elsif act < 0 && act > -reduce_n
114
+ reduce_i = act * -3
115
+ reduce_len = reduce_table[reduce_i]
116
+ reduce_to = reduce_table[reduce_i + 1]
117
+ method_id = reduce_table[reduce_i + 2]
118
+
119
+ tmp_t = racc_tstack.last reduce_len
120
+ tmp_v = racc_vstack.last reduce_len
121
+
122
+ racc_state.pop reduce_len
123
+ racc_vstack.pop reduce_len
124
+ racc_tstack.pop reduce_len
125
+
126
+ if use_result
127
+ reduce_call_result = self.__send__ method_id, tmp_v, nil, tmp_v[0]
128
+ racc_vstack.push reduce_call_result
129
+ else
130
+ raise "not using result??"
131
+ end
132
+
133
+ racc_tstack.push reduce_to
134
+
135
+ if @yydebug
136
+ racc_reduce tmp_t, reduce_to, racc_tstack, racc_vstack
137
+ end
138
+
139
+ k1 = reduce_to - nt_base
140
+
141
+ if (reduce_i = goto_pointer[k1]) != nil
142
+ reduce_i += racc_state[-1]
143
+
144
+ if (reduce_i >= 0) && ((curstate = goto_table[reduce_i]) != nil) && (goto_check[reduce_i] == k1)
145
+ racc_state.push curstate
146
+ else
147
+ racc_state.push goto_default[k1]
148
+ end
149
+
150
+ else
151
+ racc_state.push goto_default[k1]
152
+ end
153
+
154
+ elsif act == shift_n
155
+ # action
156
+ return racc_vstack[0]
157
+
158
+ elsif act == -reduce_n
159
+ # reduce
160
+ raise "Opal Syntax Error: unexpected '#{racc_tok.inspect}'"
161
+
162
+ else
163
+ raise "Rac: unknown action: #{act}"
164
+ end
165
+
166
+ if @yydebug
167
+ racc_next_state racc_state[-1], racc_state
168
+ end
169
+ # raise "and finished loop"
170
+ end
171
+
172
+ end # _racc_do_parse_rb
173
+
174
+ def racc_read_token(t, tok, val)
175
+ puts "read #{tok}(#{racc_token2str(t)}) #{val.inspect}"
176
+ puts "\n"
177
+ end
178
+
179
+ def racc_shift(tok, tstack, vstack)
180
+ puts "shift #{racc_token2str tok}"
181
+ racc_print_stacks tstack, vstack
182
+ puts "\n"
183
+ end
184
+
185
+ def racc_reduce(toks, sim, tstack, vstack)
186
+ puts "reduce #{toks.empty? ? '<none>' : toks.map { |t| racc_token2str(t) }}"
187
+ puts " --> #{racc_token2str(sim)}"
188
+ racc_print_stacks tstack, vstack
189
+ end
190
+
191
+ def racc_next_state(curstate, state)
192
+ puts "goto #{curstate}"
193
+ racc_print_states state
194
+ puts "\n"
195
+ end
196
+
197
+ def racc_token2str(tok)
198
+ self.class::Racc_token_to_s_table[tok]
199
+ end
200
+
201
+ def racc_print_stacks(t, v)
202
+ puts ' ['
203
+ t.each_index do |i|
204
+ puts " (#{racc_token2str(t[i])} #{v[i].inspect})"
205
+ end
206
+ puts ' ]'
207
+ end
208
+
209
+ def racc_print_states(s)
210
+ puts ' ['
211
+ s.each { |st| puts " #{st}" }
212
+ puts ' ]'
213
+ end
214
+ end
215
+ end
data/core/regexp.rb CHANGED
@@ -20,9 +20,9 @@ class Regexp < `RegExp`
20
20
  var result = #{self}.exec(string);
21
21
 
22
22
  if (result) {
23
- var matchdata = #{MatchData};
24
- result.$k = matchdata;
25
- result.$m = matchdata.$m_tbl;
23
+ result.$to_s = match_to_s;
24
+ result.$inspect = match_inspect;
25
+ result._klass = #{MatchData};
26
26
 
27
27
  #{$~ = `result`};
28
28
  }
@@ -45,9 +45,9 @@ class Regexp < `RegExp`
45
45
  var result = #{self}.exec(pattern);
46
46
 
47
47
  if (result) {
48
- var matchdata = #{MatchData};
49
- result.$k = matchdata;
50
- result.$m = matchdata.$m_tbl;
48
+ result.$to_s = match_to_s;
49
+ result.$inspect = match_inspect;
50
+ result._klass = #{MatchData};
51
51
 
52
52
  return #{$~ = `result`};
53
53
  }
@@ -60,22 +60,17 @@ class Regexp < `RegExp`
60
60
  def to_s
61
61
  `#{self}.source`
62
62
  end
63
- end
64
-
65
- class MatchData
66
- def [](idx)
67
- `#{self}[idx]`
68
- end
69
63
 
70
- def inspect
71
- "#<MatchData #{self[0].inspect}>"
72
- end
64
+ %x{
65
+ function match_to_s() {
66
+ return this[0];
67
+ }
73
68
 
74
- def to_a
75
- `#{self}.slice()`
76
- end
69
+ function match_inspect() {
70
+ return "<#MatchData " + this[0].$inspect() + ">";
71
+ }
72
+ }
73
+ end
77
74
 
78
- def to_s
79
- self[0]
80
- end
75
+ class MatchData
81
76
  end
data/core/runtime.js CHANGED
@@ -28,12 +28,6 @@ Opal.alloc = TopScope;
28
28
  // This is a useful reference to global object inside ruby files
29
29
  Opal.global = this;
30
30
 
31
- // Root method table (BasicObject inherits from this)
32
- function RootMethodTableConstructor() {}
33
-
34
- // The prototype (actual table) for root
35
- var RootMethodTable = RootMethodTableConstructor.prototype;
36
-
37
31
  // Minify common function calls
38
32
  var __hasOwn = Opal.hasOwnProperty;
39
33
  var __slice = Opal.slice = Array.prototype.slice;
@@ -47,34 +41,6 @@ Opal.cvars = {};
47
41
  // Globals table
48
42
  Opal.gvars = {};
49
43
 
50
- var method_missing_mid = '';
51
-
52
- function method_missing_handler(self) {
53
- var args = __slice.call(arguments, 1);
54
- return self.$m.method_missing.apply(null, [self, method_missing_mid].concat(args));
55
- }
56
-
57
- Opal.mm = function(mid) {
58
- method_missing_mid = mid;
59
- return method_missing_handler;
60
- };
61
-
62
- Opal.send = function(recv, mid) {
63
- var args = __slice.call(arguments, 2);
64
- return (recv.$m[mid] || Opal.mm(mid)).apply(null, [recv].concat(args));
65
- };
66
-
67
- // define singleton method
68
- Opal.defs = function(obj, name, method) {
69
- var singleton;
70
-
71
- if (!(singleton = obj._singleton)) {
72
- singleton = Opal.send(obj, 'singleton_class');
73
- }
74
-
75
- singleton.$m_tbl[name] = method;
76
- };
77
-
78
44
  // Runtime method used to either define a new class, or re-open an old
79
45
  // class. The base may be an object (rather than a class), which is
80
46
  // always the case when defining classes in the top level as the top
@@ -110,7 +76,7 @@ Opal.defs = function(obj, name, method) {
110
76
  Opal.klass = function(base, superklass, id, constructor) {
111
77
  var klass;
112
78
  if (base._isObject) {
113
- base = base.$k;
79
+ base = base._klass;
114
80
  }
115
81
 
116
82
  if (superklass === null) {
@@ -121,13 +87,14 @@ Opal.klass = function(base, superklass, id, constructor) {
121
87
  klass = base._scope[id];
122
88
  }
123
89
  else {
124
- if (!superklass.$m_tbl) {
90
+ if (!superklass._methods) {
125
91
  var bridged = superklass;
126
92
  superklass = Object;
127
- constructor = bridged;
93
+ klass = bridge_class(bridged);
94
+ }
95
+ else {
96
+ klass = boot_class(superklass, constructor);
128
97
  }
129
-
130
- klass = boot_class(superklass, constructor, bridged);
131
98
 
132
99
  klass._name = (base === Object ? id : base._name + '::' + id);
133
100
 
@@ -138,8 +105,8 @@ Opal.klass = function(base, superklass, id, constructor) {
138
105
 
139
106
  base[id] = base._scope[id] = klass;
140
107
 
141
- if (superklass.$m.inherited) {
142
- superklass.$m.inherited(superklass, klass);
108
+ if (superklass.$inherited) {
109
+ superklass.$inherited(klass);
143
110
  }
144
111
  }
145
112
 
@@ -150,14 +117,14 @@ Opal.klass = function(base, superklass, id, constructor) {
150
117
  Opal.module = function(base, id, constructor) {
151
118
  var klass;
152
119
  if (base._isObject) {
153
- base = base.$k;
120
+ base = base._klass;
154
121
  }
155
122
 
156
123
  if (__hasOwn.call(base._scope, id)) {
157
124
  klass = base._scope[id];
158
125
  }
159
126
  else {
160
- klass = boot_module(constructor);
127
+ klass = boot_class(Module, constructor);
161
128
  klass._name = (base === Object ? id : base._name + '::' + id);
162
129
 
163
130
  klass._isModule = true;
@@ -188,139 +155,124 @@ var boot_defclass = function(id, constructor, superklass) {
188
155
  constructor.prototype = new ctor();
189
156
  }
190
157
 
191
- // method table constructor;
192
- var m_ctr = function() {};
193
-
194
- if (superklass) {
195
- // not BasicObject
196
- m_ctr.prototype = new superklass.$m_ctr;
197
- }
198
- else {
199
- // BasicObject
200
- m_ctr.prototype = RootMethodTable;
201
- }
202
-
203
- var m_tbl = m_ctr.prototype;
204
- m_tbl.constructor = m_ctr;
205
-
206
158
  var prototype = constructor.prototype;
207
159
 
208
160
  prototype.constructor = constructor;
209
161
  prototype._isObject = true;
210
- prototype.$k = constructor;
211
-
212
- // method table of instances
213
- prototype.$m = m_tbl;
214
-
215
- // constructor._included_in = [];
216
- // constructor._isClass = true;
217
- // constructor._name = id;
218
- // constructor._super = superklass;
219
- // constructor._methods = [];
220
- // constructor._smethods = [];
221
- constructor._isObject = false;
222
-
223
- // method table for class methods
224
- // constructor.$m = c_tbl;
225
- // method table of instances
226
- constructor.$m_tbl = m_tbl;
227
- // method table constructor of instances
228
- constructor.$m_ctr = m_ctr;
229
-
230
- constructor.$s = superklass;
162
+ prototype._klass = constructor;
231
163
 
164
+ constructor._included_in = [];
165
+ constructor._isClass = true;
232
166
  constructor._name = id;
167
+ constructor._super = superklass;
168
+ constructor._methods = [];
169
+ constructor._smethods = [];
170
+ constructor._isObject = false;
233
171
 
234
172
  constructor._donate = __donate;
173
+ constructor._sdonate = __sdonate;
235
174
 
236
175
  Opal[id] = constructor;
237
176
 
238
177
  return constructor;
239
178
  };
240
179
 
241
- var boot_defmeta = function(constructor, parent_m_tbl) {
242
- var m_ctr = function(){};
243
- m_ctr.prototype = new parent_m_tbl;
180
+ // Create generic class with given superclass.
181
+ var boot_class = function(superklass, constructor) {
182
+ var ctor = function() {};
183
+ ctor.prototype = superklass.prototype;
184
+
185
+ constructor.prototype = new ctor();
186
+ var prototype = constructor.prototype;
187
+
188
+ prototype._klass = constructor;
189
+ prototype.constructor = constructor;
190
+
191
+ constructor._included_in = [];
192
+ constructor._isClass = true;
193
+ constructor._super = superklass;
194
+ constructor._methods = [];
195
+ constructor._isObject = false;
196
+ constructor._klass = Class;
197
+ constructor._donate = __donate
198
+ constructor._sdonate = __sdonate;
244
199
 
245
- var m_tbl = m_ctr.prototype;
246
- m_tbl.constructor = m_ctr;
200
+ constructor['$==='] = module_eqq;
201
+ constructor.$to_s = module_to_s;
247
202
 
248
- constructor.$m = m_tbl;
203
+ var smethods;
204
+
205
+ smethods = superklass._smethods.slice();
206
+
207
+ constructor._smethods = smethods;
208
+ for (var i = 0, length = smethods.length; i < length; i++) {
209
+ var m = smethods[i];
210
+ constructor[m] = superklass[m];
211
+ }
249
212
 
250
213
  return constructor;
251
214
  };
252
215
 
253
- // Create generic class with given superclass.
254
- var boot_class = function(superklass, constructor, bridged) {
255
- // method table constructor
256
- function m_ctr(){};
257
- m_ctr.prototype = new superklass.$m_tbl.constructor;
258
-
259
- // method table itself
260
- var m_tbl = m_ctr.prototype;
261
- m_tbl.constructor = m_ctr;
216
+ var bridge_class = function(constructor) {
217
+ constructor.prototype._klass = constructor;
262
218
 
263
- var prototype = constructor.prototype;
219
+ constructor._included_in = [];
220
+ constructor._isClass = true;
221
+ constructor._super = Object;
222
+ constructor._klass = Class;
223
+ constructor._methods = [];
224
+ constructor._smethods = [];
225
+ constructor._isObject = false;
264
226
 
265
- if (!bridged) {
266
- constructor.prototype = new superklass;
267
- prototype = constructor.prototype;
268
- prototype.constructor = constructor;
269
- }
227
+ constructor._donate = function(){};
228
+ constructor._sdonate = __sdonate;
270
229
 
271
- prototype.$k = constructor; // instances need to know their class
272
- prototype.$m = m_tbl; // all instances get method table
230
+ constructor['$==='] = module_eqq;
231
+ constructor.$to_s = module_to_s;
273
232
 
274
- prototype._isObject = true;
233
+ var smethods = constructor._smethods = Module._methods.slice();
234
+ for (var i = 0, length = smethods.length; i < length; i++) {
235
+ var m = smethods[i];
236
+ constructor[m] = Object[m];
237
+ }
275
238
 
276
- constructor.$m_ctr = m_ctr;
277
- constructor.$m_tbl = m_tbl;
239
+ bridged_classes.push(constructor);
278
240
 
279
- // FIXME: need c_ctr
280
- var c_ctr = function(){};
281
- c_ctr.prototype = new superklass.$m.constructor;
241
+ var allocator = function(initializer) {
242
+ var result, kls = this, methods = kls._methods, proto = kls.prototype;
282
243
 
283
- var c_tbl = c_ctr.prototype;
284
- c_tbl.constructor = c_ctr;
285
- constructor.$m = c_tbl;
244
+ if (initializer == null) {
245
+ result = new constructor
246
+ }
247
+ else {
248
+ result = new constructor(initializer);
249
+ }
286
250
 
251
+ if (kls === constructor) {
252
+ return result;
253
+ }
287
254
 
288
- constructor.$k = Class;
289
- constructor.$s = superklass;
255
+ result._klass = kls;
290
256
 
291
- constructor._donate = __donate
292
- // constructor._included_in = [];
293
- // constructor._isClass = true;
294
- // constructor._super = superklass;
295
- // constructor._methods = [];
296
- constructor._isObject = false;
297
- // constructor._klass = Class;
298
-
299
- return constructor;
300
- };
257
+ for (var i = 0, length = methods.length; i < length; i++) {
258
+ var method = methods[i];
259
+ result[method] = proto[method];
260
+ }
301
261
 
302
- var boot_module = function(constructor) {
303
- // constructor.$m_ctr = m_ctr;
304
- constructor.$m_tbl = {}; // simple method table for modules
262
+ return result;
263
+ };
305
264
 
306
- // FIXME: need c_ctr
307
- var c_ctr = function(){};
308
- c_ctr.prototype = new Module.$m.constructor;
309
-
310
- var c_tbl = c_ctr.prototype;
311
- constructor.$m = c_tbl;
265
+ var table = Object.prototype, methods = Object._methods;
312
266
 
267
+ for (var i = 0, length = methods.length; i < length; i++) {
268
+ var m = methods[i];
269
+ constructor.prototype[m] = table[m];
270
+ }
313
271
 
314
- constructor.$k = Class;
272
+ constructor.$allocate = allocator;
273
+
274
+ constructor._smethods.push('$allocate');
315
275
 
316
- constructor._donate = __donate
317
- // constructor._included_in = [];
318
- // constructor._isClass = true;
319
- // constructor._super = superklass;
320
- // constructor._methods = [];
321
- constructor._isObject = false;
322
- // constructor._klass = Class;
323
-
324
276
  return constructor;
325
277
  };
326
278
 
@@ -331,39 +283,75 @@ boot_defclass('BasicObject', BasicObject);
331
283
  boot_defclass('Object', Object, BasicObject);
332
284
  boot_defclass('Class', Class, Object);
333
285
 
334
- boot_defmeta(BasicObject, Class.$m_tbl.constructor);
335
- boot_defmeta(Object, BasicObject.$m.constructor);
336
- boot_defmeta(Class, Object.$m.constructor);
286
+ Class.prototype = Function.prototype;
287
+
288
+ BasicObject._klass = Object._klass = Class._klass = Class;
289
+
290
+ Module._donate = function(defined) {
291
+ // ...
292
+ };
293
+
294
+ // Implementation of Module#===
295
+ function module_eqq(object) {
296
+ if (object == null) {
297
+ return false;
298
+ }
299
+
300
+ var search = object._klass;
301
+
302
+ while (search) {
303
+ if (search === this) {
304
+ return true;
305
+ }
337
306
 
338
- BasicObject.$k = Object.$k = Class.$k = Class;
307
+ search = search._super;
308
+ }
309
+
310
+ return false;
311
+ }
312
+
313
+ // Implementation of Module#to_s
314
+ function module_to_s() {
315
+ return this._name;
316
+ }
339
317
 
340
318
  // Donator for all 'normal' classes and modules
341
- function __donate(defined) {
342
- var included_in = this.$included_in, m_tbl = this.$m_tbl;
319
+ function __donate(defined, indirect) {
320
+ var methods = this._methods, included_in = this.$included_in;
321
+
322
+ // if (!indirect) {
323
+ this._methods = methods.concat(defined);
324
+ // }
343
325
 
344
326
  if (included_in) {
345
327
  for (var i = 0, length = included_in.length; i < length; i++) {
346
328
  var includee = included_in[i];
347
- var dest = includee.$m_tbl;
329
+ var dest = includee.prototype;
348
330
 
349
- for (var idx = 0, jj = defined.length; idx < jj; idx++) {
350
- var method = defined[idx];
351
- dest[method] = m_tbl[method];
331
+ for (var j = 0, jj = defined.length; j < jj; j++) {
332
+ var method = defined[j];
333
+ dest[method] = this.prototype[method];
352
334
  }
353
335
 
354
336
  if (includee.$included_in) {
355
- // includee._donate(defined, true);
337
+ includee._donate(defined, true);
356
338
  }
357
339
  }
358
340
 
359
341
  }
360
342
  }
361
343
 
344
+ // Donator for singleton (class) methods
345
+ function __sdonate(defined) {
346
+ this._smethods = this._smethods.concat(defined);
347
+ }
348
+
362
349
  var bridged_classes = Object.$included_in = [];
363
350
  BasicObject.$included_in = bridged_classes;
364
351
 
365
352
  BasicObject._scope = Object._scope = Opal;
366
353
  Opal.Module = Opal.Class;
354
+ Opal.Kernel = Object;
367
355
 
368
356
  var class_const_alloc = function(){};
369
357
  var class_const_scope = new TopScope();
@@ -371,7 +359,7 @@ class_const_scope.alloc = class_const_alloc;
371
359
  Class._scope = class_const_scope;
372
360
 
373
361
  Object.prototype.toString = function() {
374
- return this.$m.to_s(this, 'to_s');
362
+ return this.$to_s();
375
363
  };
376
364
 
377
365
  Opal.top = new Object;