opal 0.3.15 → 0.3.16

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 (236) hide show
  1. data/.gitignore +1 -1
  2. data/Gemfile +8 -2
  3. data/README.md +1 -1
  4. data/Rakefile +51 -57
  5. data/bin/opal +50 -2
  6. data/{runtime/corelib → core}/alpha.rb +6 -1
  7. data/{runtime/corelib → core}/array.rb +38 -42
  8. data/{runtime/corelib → core}/basic_object.rb +6 -17
  9. data/core/boolean.rb +40 -0
  10. data/core/class.rb +69 -0
  11. data/{runtime/corelib → core}/comparable.rb +0 -0
  12. data/core/debug.js +59 -0
  13. data/core/debug.rb +35 -0
  14. data/core/dir.rb +90 -0
  15. data/core/enumerable.rb +331 -0
  16. data/core/enumerator.rb +126 -0
  17. data/core/error.rb +40 -0
  18. data/{runtime/corelib → core}/file.rb +6 -3
  19. data/core/gemlib.rb +30 -0
  20. data/{runtime/corelib → core}/hash.rb +37 -35
  21. data/{runtime/corelib → core}/io.rb +0 -0
  22. data/{runtime/corelib → core}/kernel.rb +26 -21
  23. data/{runtime/corelib → core}/load_order +2 -5
  24. data/{runtime/corelib → core}/match_data.rb +2 -4
  25. data/core/module.rb +204 -0
  26. data/{runtime/corelib → core}/nil_class.rb +1 -7
  27. data/{runtime/corelib → core}/numeric.rb +9 -13
  28. data/core/object.rb +17 -0
  29. data/{runtime/corelib → core}/proc.rb +2 -13
  30. data/{runtime/corelib → core}/range.rb +19 -7
  31. data/{runtime/corelib → core}/rational.rb +0 -0
  32. data/{runtime/corelib → core}/regexp.rb +2 -6
  33. data/core/runtime.js +672 -0
  34. data/{runtime/corelib → core}/string.rb +25 -9
  35. data/{runtime/corelib → core}/struct.rb +0 -0
  36. data/core/time.rb +111 -0
  37. data/{runtime/corelib → core}/top_self.rb +0 -0
  38. data/{runtime/spec → core_spec}/README.md +0 -0
  39. data/{runtime/spec → core_spec}/core/array/allocate_spec.rb +0 -0
  40. data/{runtime/spec → core_spec}/core/array/append_spec.rb +0 -0
  41. data/{runtime/spec → core_spec}/core/array/assoc_spec.rb +0 -0
  42. data/{runtime/spec → core_spec}/core/array/at_spec.rb +0 -0
  43. data/{runtime/spec → core_spec}/core/array/clear_spec.rb +0 -0
  44. data/{runtime/spec → core_spec}/core/array/collect_spec.rb +0 -0
  45. data/{runtime/spec → core_spec}/core/array/compact_spec.rb +0 -0
  46. data/{runtime/spec → core_spec}/core/array/concat_spec.rb +0 -0
  47. data/{runtime/spec → core_spec}/core/array/constructor_spec.rb +0 -0
  48. data/{runtime/spec → core_spec}/core/array/count_spec.rb +0 -0
  49. data/{runtime/spec → core_spec}/core/array/delete_at_spec.rb +0 -0
  50. data/{runtime/spec → core_spec}/core/array/delete_if_spec.rb +0 -0
  51. data/{runtime/spec → core_spec}/core/array/delete_spec.rb +0 -0
  52. data/{runtime/spec → core_spec}/core/array/each_index_spec.rb +0 -0
  53. data/{runtime/spec → core_spec}/core/array/each_spec.rb +0 -0
  54. data/{runtime/spec → core_spec}/core/array/element_reference_spec.rb +0 -0
  55. data/{runtime/spec → core_spec}/core/array/element_set_spec.rb +0 -0
  56. data/{runtime/spec → core_spec}/core/array/empty_spec.rb +0 -0
  57. data/{runtime/spec → core_spec}/core/array/eql_spec.rb +0 -0
  58. data/{runtime/spec → core_spec}/core/array/equal_value_spec.rb +0 -0
  59. data/{runtime/spec → core_spec}/core/array/fetch_spec.rb +0 -0
  60. data/{runtime/spec → core_spec}/core/array/first_spec.rb +0 -0
  61. data/{runtime/spec → core_spec}/core/array/fixtures/classes.rb +0 -0
  62. data/{runtime/spec → core_spec}/core/array/flatten_spec.rb +0 -0
  63. data/{runtime/spec → core_spec}/core/array/include_spec.rb +0 -0
  64. data/{runtime/spec → core_spec}/core/array/insert_spec.rb +0 -0
  65. data/{runtime/spec → core_spec}/core/array/last_spec.rb +0 -0
  66. data/{runtime/spec → core_spec}/core/array/length_spec.rb +0 -0
  67. data/{runtime/spec → core_spec}/core/array/map_spec.rb +0 -0
  68. data/{runtime/spec → core_spec}/core/array/plus_spec.rb +0 -0
  69. data/{runtime/spec → core_spec}/core/array/pop_spec.rb +0 -0
  70. data/{runtime/spec → core_spec}/core/array/push_spec.rb +0 -0
  71. data/{runtime/spec → core_spec}/core/array/rassoc_spec.rb +0 -0
  72. data/{runtime/spec → core_spec}/core/array/reject_spec.rb +0 -0
  73. data/{runtime/spec → core_spec}/core/array/replace_spec.rb +0 -0
  74. data/{runtime/spec → core_spec}/core/array/reverse_each_spec.rb +0 -0
  75. data/{runtime/spec → core_spec}/core/array/reverse_spec.rb +0 -0
  76. data/{runtime/spec → core_spec}/core/array/shared/collect.rb +0 -0
  77. data/{runtime/spec → core_spec}/core/array/shared/eql.rb +0 -0
  78. data/{runtime/spec → core_spec}/core/array/shared/length.rb +0 -0
  79. data/{runtime/spec → core_spec}/core/array/shared/replace.rb +0 -0
  80. data/{runtime/spec → core_spec}/core/class/new_spec.rb +0 -0
  81. data/{runtime/spec → core_spec}/core/enumerable/all_spec.rb +0 -0
  82. data/{runtime/spec → core_spec}/core/enumerable/any_spec.rb +0 -0
  83. data/{runtime/spec → core_spec}/core/enumerable/collect_spec.rb +0 -0
  84. data/{runtime/spec → core_spec}/core/enumerable/count_spec.rb +0 -0
  85. data/{runtime/spec → core_spec}/core/enumerable/detect_spec.rb +0 -0
  86. data/{runtime/spec → core_spec}/core/enumerable/find_spec.rb +0 -0
  87. data/core_spec/core/enumerable/first_spec.rb +3 -0
  88. data/{runtime/spec → core_spec}/core/enumerable/fixtures/classes.rb +0 -0
  89. data/{runtime/spec → core_spec}/core/enumerable/shared/collect.rb +0 -0
  90. data/{runtime/spec → core_spec}/core/enumerable/shared/entries.rb +0 -0
  91. data/{runtime/spec → core_spec}/core/enumerable/shared/find.rb +0 -0
  92. data/core_spec/core/enumerable/shared/take.rb +31 -0
  93. data/{runtime/spec → core_spec}/core/enumerable/to_a_spec.rb +0 -0
  94. data/{runtime/spec → core_spec}/core/false/and_spec.rb +0 -0
  95. data/{runtime/spec → core_spec}/core/false/inspect_spec.rb +0 -0
  96. data/{runtime/spec → core_spec}/core/false/or_spec.rb +0 -0
  97. data/{runtime/spec → core_spec}/core/false/to_s_spec.rb +0 -0
  98. data/{runtime/spec → core_spec}/core/false/xor_spec.rb +0 -0
  99. data/{runtime/spec → core_spec}/core/hash/allocate_spec.rb +0 -0
  100. data/{runtime/spec → core_spec}/core/hash/assoc_spec.rb +0 -0
  101. data/{runtime/spec → core_spec}/core/hash/clear_spec.rb +0 -0
  102. data/{runtime/spec → core_spec}/core/hash/clone_spec.rb +0 -0
  103. data/{runtime/spec → core_spec}/core/hash/default_spec.rb +0 -0
  104. data/{runtime/spec → core_spec}/core/hash/delete_if_spec.rb +0 -0
  105. data/{runtime/spec → core_spec}/core/hash/element_reference_spec.rb +0 -0
  106. data/{runtime/spec → core_spec}/core/hash/element_set_spec.rb +0 -0
  107. data/{runtime/spec → core_spec}/core/hash/new_spec.rb +0 -0
  108. data/{runtime/spec → core_spec}/core/matchdata/to_a_spec.rb +0 -0
  109. data/{runtime/spec → core_spec}/core/nil/and_spec.rb +0 -0
  110. data/{runtime/spec → core_spec}/core/nil/inspect_spec.rb +0 -0
  111. data/{runtime/spec → core_spec}/core/nil/nil_spec.rb +0 -0
  112. data/{runtime/spec → core_spec}/core/nil/or_spec.rb +0 -0
  113. data/{runtime/spec → core_spec}/core/nil/to_a_spec.rb +0 -0
  114. data/{runtime/spec → core_spec}/core/nil/to_f_spec.rb +0 -0
  115. data/{runtime/spec → core_spec}/core/nil/to_i_spec.rb +0 -0
  116. data/{runtime/spec → core_spec}/core/nil/to_s_spec.rb +0 -0
  117. data/{runtime/spec → core_spec}/core/nil/xor_spec.rb +0 -0
  118. data/{runtime/spec → core_spec}/core/numeric/equal_value_spec.rb +0 -0
  119. data/{runtime/spec → core_spec}/core/object/is_a_spec.rb +0 -0
  120. data/{runtime/spec → core_spec}/core/object/shared/kind_of.rb +0 -0
  121. data/{runtime/spec → core_spec}/core/regexp/match_spec.rb +0 -0
  122. data/{runtime/spec → core_spec}/core/regexp/shared/match.rb +0 -0
  123. data/{runtime/spec → core_spec}/core/symbol/to_proc_spec.rb +0 -0
  124. data/{runtime/spec → core_spec}/core/true/and_spec.rb +0 -0
  125. data/{runtime/spec → core_spec}/core/true/inspect_spec.rb +0 -0
  126. data/{runtime/spec → core_spec}/core/true/or_spec.rb +0 -0
  127. data/{runtime/spec → core_spec}/core/true/to_s_spec.rb +0 -0
  128. data/{runtime/spec → core_spec}/core/true/xor_spec.rb +0 -0
  129. data/{runtime/spec → core_spec}/language/alias_spec.rb +0 -0
  130. data/{runtime/spec → core_spec}/language/and_spec.rb +0 -0
  131. data/{runtime/spec → core_spec}/language/array_spec.rb +0 -0
  132. data/{runtime/spec → core_spec}/language/block_spec.rb +0 -0
  133. data/{runtime/spec → core_spec}/language/break_spec.rb +0 -0
  134. data/{runtime/spec → core_spec}/language/case_spec.rb +0 -0
  135. data/{runtime/spec → core_spec}/language/defined_spec.rb +0 -0
  136. data/{runtime/spec → core_spec}/language/ensure_spec.rb +0 -0
  137. data/{runtime/spec → core_spec}/language/fixtures/block.rb +0 -0
  138. data/{runtime/spec → core_spec}/language/fixtures/break.rb +0 -0
  139. data/{runtime/spec → core_spec}/language/fixtures/defined.rb +0 -0
  140. data/{runtime/spec → core_spec}/language/fixtures/ensure.rb +0 -0
  141. data/{runtime/spec → core_spec}/language/fixtures/next.rb +0 -0
  142. data/{runtime/spec → core_spec}/language/fixtures/send.rb +0 -0
  143. data/{runtime/spec → core_spec}/language/fixtures/super.rb +0 -0
  144. data/{runtime/spec → core_spec}/language/hash_spec.rb +0 -0
  145. data/{runtime/spec → core_spec}/language/if_spec.rb +0 -0
  146. data/{runtime/spec → core_spec}/language/loop_spec.rb +0 -0
  147. data/{runtime/spec → core_spec}/language/next_spec.rb +0 -0
  148. data/{runtime/spec → core_spec}/language/or_spec.rb +0 -0
  149. data/{runtime/spec → core_spec}/language/predefined_spec.rb +0 -0
  150. data/{runtime/spec → core_spec}/language/regexp/interpolation_spec.rb +8 -0
  151. data/{runtime/spec → core_spec}/language/regexp_spec.rb +0 -0
  152. data/{runtime/spec → core_spec}/language/send_spec.rb +0 -0
  153. data/{runtime/spec → core_spec}/language/string_spec.rb +0 -0
  154. data/{runtime/spec → core_spec}/language/super_spec.rb +0 -0
  155. data/{runtime/spec → core_spec}/language/symbol_spec.rb +0 -0
  156. data/{runtime/spec → core_spec}/language/undef_spec.rb +0 -0
  157. data/{runtime/spec → core_spec}/language/unless_spec.rb +0 -0
  158. data/{runtime/spec → core_spec}/language/until_spec.rb +0 -0
  159. data/core_spec/language/variables_spec.rb +112 -0
  160. data/{runtime/spec → core_spec}/language/versions/hash_1.9.rb +0 -0
  161. data/{runtime/spec → core_spec}/language/while_spec.rb +0 -0
  162. data/{runtime/spec → core_spec}/opal/opal/defined_spec.rb +0 -0
  163. data/{runtime/spec → core_spec}/opal/opal/function_spec.rb +0 -0
  164. data/{runtime/spec → core_spec}/opal/opal/native_spec.rb +0 -0
  165. data/{runtime/spec → core_spec}/opal/opal/null_spec.rb +0 -0
  166. data/{runtime/spec → core_spec}/opal/opal/number_spec.rb +0 -0
  167. data/{runtime/spec → core_spec}/opal/opal/object_spec.rb +0 -0
  168. data/{runtime/spec → core_spec}/opal/opal/string_spec.rb +0 -0
  169. data/{runtime/spec → core_spec}/opal/opal/typeof_spec.rb +0 -0
  170. data/{runtime/spec → core_spec}/opal/opal/undefined_spec.rb +0 -0
  171. data/{runtime/spec → core_spec}/opal/true/case_compare_spec.rb +0 -0
  172. data/{runtime/spec → core_spec}/opal/true/class_spec.rb +0 -0
  173. data/{docs/spec_runner.html → core_spec/release_runner.html} +4 -3
  174. data/core_spec/runner.html +16 -0
  175. data/core_spec/spec_helper.rb +23 -0
  176. data/lib/opal.rb +85 -2
  177. data/lib/opal/builder.rb +129 -46
  178. data/lib/opal/context.rb +47 -26
  179. data/lib/opal/dependency_builder.rb +113 -14
  180. data/lib/opal/environment.rb +40 -45
  181. data/lib/opal/parser/grammar.rb +2296 -2254
  182. data/lib/opal/parser/grammar.y +27 -8
  183. data/lib/opal/parser/lexer.rb +12 -3
  184. data/lib/opal/parser/parser.rb +117 -30
  185. data/lib/opal/parser/scope.rb +2 -2
  186. data/lib/opal/version.rb +1 -1
  187. data/opal.gemspec +3 -8
  188. data/spec/grammar/masgn_spec.rb +37 -0
  189. metadata +177 -227
  190. data/index.html +0 -434
  191. data/lib/opal/command.rb +0 -73
  192. data/runtime/README.md +0 -25
  193. data/runtime/corelib/boolean.rb +0 -44
  194. data/runtime/corelib/class.rb +0 -43
  195. data/runtime/corelib/complex.rb +0 -2
  196. data/runtime/corelib/dir.rb +0 -29
  197. data/runtime/corelib/enumerable.rb +0 -316
  198. data/runtime/corelib/enumerator.rb +0 -80
  199. data/runtime/corelib/error.rb +0 -25
  200. data/runtime/corelib/module.rb +0 -171
  201. data/runtime/corelib/native.rb +0 -50
  202. data/runtime/corelib/object.rb +0 -21
  203. data/runtime/corelib/time.rb +0 -196
  204. data/runtime/gemlib/alpha.rb +0 -5
  205. data/runtime/gemlib/kernel.rb +0 -17
  206. data/runtime/gemlib/load_order +0 -2
  207. data/runtime/kernel/class.js +0 -256
  208. data/runtime/kernel/debug.js +0 -42
  209. data/runtime/kernel/init.js +0 -114
  210. data/runtime/kernel/load_order +0 -5
  211. data/runtime/kernel/loader.js +0 -151
  212. data/runtime/kernel/runtime.js +0 -414
  213. data/runtime/spec/language/variables_spec.rb +0 -28
  214. data/runtime/spec/library/stringscanner/scan_spec.rb +0 -36
  215. data/runtime/spec/opal/forwardable/def_instance_delegator_spec.rb +0 -49
  216. data/runtime/spec/spec_helper.rb +0 -25
  217. data/runtime/stdlib/base64.rb +0 -91
  218. data/runtime/stdlib/date.rb +0 -4
  219. data/runtime/stdlib/dev.rb +0 -171
  220. data/runtime/stdlib/forwardable.rb +0 -33
  221. data/runtime/stdlib/optparse.rb +0 -0
  222. data/runtime/stdlib/pp.rb +0 -6
  223. data/runtime/stdlib/racc/parser.rb +0 -159
  224. data/runtime/stdlib/rbconfig.rb +0 -0
  225. data/runtime/stdlib/si.rb +0 -17
  226. data/runtime/stdlib/strscan.rb +0 -53
  227. data/runtime/stdlib/uri.rb +0 -111
  228. data/runtime/stdlib/uri/common.rb +0 -1014
  229. data/runtime/stdlib/uri/ftp.rb +0 -261
  230. data/runtime/stdlib/uri/generic.rb +0 -1599
  231. data/runtime/stdlib/uri/http.rb +0 -106
  232. data/runtime/stdlib/uri/https.rb +0 -22
  233. data/runtime/stdlib/uri/ldap.rb +0 -260
  234. data/runtime/stdlib/uri/ldaps.rb +0 -20
  235. data/runtime/stdlib/uri/mailto.rb +0 -280
  236. data/spec/builder/output_path_spec.rb +0 -50
data/core/runtime.js ADDED
@@ -0,0 +1,672 @@
1
+ var opal = this.opal = {};
2
+ opal.global = this;
3
+
4
+ // Minify common function calls
5
+ var hasOwnProperty = Object.prototype.hasOwnProperty,
6
+ $slice = Array.prototype.slice;
7
+
8
+ // Types - also added to bridged objects
9
+ var T_CLASS = 0x0001,
10
+ T_MODULE = 0x0002,
11
+ T_OBJECT = 0x0004,
12
+ T_BOOLEAN = 0x0008,
13
+ T_STRING = 0x0010,
14
+ T_ARRAY = 0x0020,
15
+ T_NUMBER = 0x0040,
16
+ T_PROC = 0x0080,
17
+ T_HASH = 0x0100,
18
+ T_RANGE = 0x0200,
19
+ T_ICLASS = 0x0400,
20
+ FL_SINGLETON = 0x0800;
21
+
22
+ // Generates unique id for every ruby object
23
+ var unique_id = 0;
24
+
25
+ // Find function body for the super call
26
+ function find_super(klass, callee, mid) {
27
+ var cur_method;
28
+
29
+ while (klass) {
30
+ if (klass.$m[mid]) {
31
+ if (klass.$m[mid] == callee) {
32
+ cur_method = klass.$m[mid];
33
+ break;
34
+ }
35
+ }
36
+ klass = klass.$s;
37
+ }
38
+
39
+ if (!(klass && cur_method)) { return null; }
40
+
41
+ klass = klass.$s;
42
+
43
+ while (klass) {
44
+ if (klass.$m[mid]) {
45
+ return klass.$m[mid];
46
+ }
47
+
48
+ klass = klass.$s;
49
+ }
50
+ }
51
+
52
+ // Jump return - return in proc body
53
+ opal.jump = function(value, func) {
54
+ throw new Error('jump return');
55
+ };
56
+
57
+ // Get constant with given id
58
+ opal.const_get = function(const_table, id) {
59
+ if (const_table[id]) {
60
+ return const_table[id];
61
+ }
62
+
63
+ throw RubyNameError.$new('uninitialized constant ' + id);
64
+ };
65
+
66
+ // Table holds all class variables
67
+ opal.cvars = {};
68
+
69
+ // Array of all procs to be called at_exit
70
+ var end_procs = [];
71
+
72
+ // Call exit blocks in reverse order
73
+ opal.do_at_exit = function() {
74
+ var proc;
75
+
76
+ while (proc = end_procs.pop()) {
77
+ proc.call(proc.$S);
78
+ }
79
+ };
80
+
81
+ // Globals table
82
+ opal.gvars = {};
83
+
84
+ // Define a method alias
85
+ opal.alias = function(klass, new_name, old_name) {
86
+ new_name = mid_to_jsid(new_name);
87
+ old_name = mid_to_jsid(old_name);
88
+
89
+ var body = klass.$proto[old_name];
90
+
91
+ if (!body) {
92
+ throw RubyNameError.$new("undefined method `" + old_name + "' for class `" + klass.$name + "'");
93
+ }
94
+
95
+ define_method(klass, new_name, body);
96
+ return nil;
97
+ };
98
+
99
+ // method missing yielder - used in debug mode to call method_missing.
100
+ opal.mm = function(jsid) {
101
+ var mid = jsid_to_mid(jsid);
102
+ return function() {
103
+ var args = $slice.call(arguments);
104
+ args.unshift(mid);
105
+ return this.$method_missing.apply(this, args);
106
+ };
107
+ }
108
+
109
+ // Actually define methods
110
+ var define_method = opal.defn = function(klass, id, body) {
111
+ // If an object, make sure to use its class
112
+ if (klass.$flags & T_OBJECT) {
113
+ klass = klass.$klass;
114
+ }
115
+
116
+ klass.$allocator.prototype[id] = body;
117
+
118
+ var included_in = klass.$included_in, includee;
119
+
120
+ if (included_in) {
121
+ for (var i = 0, ii = included_in.length; i < ii; i++) {
122
+ includee = included_in[i];
123
+
124
+ define_method(includee, id, body);
125
+ }
126
+ }
127
+
128
+ if (klass.$bridge_prototype) {
129
+ klass.$bridge_prototype[id] = body;
130
+ }
131
+
132
+
133
+ return nil;
134
+ }
135
+
136
+ // Fake yielder used when no block given
137
+ opal.no_proc = function() {
138
+ throw RubyLocalJumpError.$new('no block given');
139
+ };
140
+
141
+ function define_module(base, id) {
142
+ var module;
143
+
144
+ module = boot_module();
145
+ module.$name = (base === RubyObject ? id : base.$name + '::' + id)
146
+
147
+ make_metaclass(module, RubyModule);
148
+
149
+ module.$flags = T_MODULE;
150
+ module.$included_in = [];
151
+
152
+ var const_alloc = function() {};
153
+ var const_scope = const_alloc.prototype = new base.$const.alloc();
154
+ module.$const = const_scope;
155
+ const_scope.alloc = const_alloc;
156
+
157
+ base.$const[id] = module;
158
+
159
+ return module;
160
+ }
161
+
162
+ // opal define class. 0: regular, 1: module, 2: shift class.
163
+ opal.klass = function(base, superklass, id, body, type) {
164
+ var klass;
165
+
166
+ switch (type) {
167
+ case 0:
168
+ if (base.$flags & T_OBJECT) {
169
+ base = class_real(base.$klass);
170
+ }
171
+
172
+ if (superklass === nil) {
173
+ superklass = RubyObject;
174
+ }
175
+
176
+ if (hasOwnProperty.call(base.$const, id)) {
177
+ klass = base.$const[id];
178
+ }
179
+ else {
180
+ klass = define_class(base, id, superklass);
181
+ }
182
+
183
+ break;
184
+
185
+ case 1:
186
+ if (base.$flags & T_OBJECT) {
187
+ base = class_real(base.$klass);
188
+ }
189
+
190
+ if (hasOwnProperty.call(base.$const, id)) {
191
+ klass = base.$const[id];
192
+ }
193
+ else {
194
+ klass = define_module(base, id);
195
+ }
196
+
197
+ break;
198
+
199
+ case 2:
200
+ klass = singleton_class(base);
201
+ break;
202
+ }
203
+
204
+ return body.call(klass);
205
+ };
206
+
207
+ opal.slice = $slice;
208
+
209
+ opal.defs = function(base, id, body) {
210
+ return define_method(singleton_class(base), id, body);
211
+ };
212
+
213
+ // Undefine one or more methods
214
+ opal.undef = function(klass) {
215
+ var args = $slice.call(arguments, 1);
216
+
217
+ for (var i = 0, length = args.length; i < length; i++) {
218
+ var mid = args[i], id = mid_to_jsid[mid];
219
+
220
+ delete klass.$m_tbl[id];
221
+ }
222
+ };
223
+
224
+ // Calls a super method.
225
+ opal.zuper = function(callee, self, args) {
226
+ var mid = callee.$rbName,
227
+ func = find_super(self.$klass, callee, mid);
228
+
229
+ if (!func) {
230
+ throw RubyNoMethodError.$new("super: no superclass method `" + mid + "'"
231
+ + " for " + self.$inspect());
232
+ }
233
+
234
+ return func.apply(self, args);
235
+ };
236
+
237
+ var mid_to_jsid = opal.mid_to_jsid = function(mid) {
238
+ if (method_names[mid]) {
239
+ return method_names[mid];
240
+ }
241
+
242
+ return '$' + mid.replace('!', '$b').replace('?', '$p').replace('=', '$e');
243
+ }
244
+
245
+ var jsid_to_mid = opal.jsid_to_mid = function(jsid) {
246
+ if (reverse_method_names[jsid]) {
247
+ return reverse_method_names[jsid];
248
+ }
249
+
250
+ jsid = jsid.substr(1); // remove '$'
251
+
252
+ return jsid.replace('$b', '!').replace('$p', '?').replace('$e', '=');
253
+ }
254
+
255
+ opal.arg_error = function(given, expected) {
256
+ throw RubyArgError.$new('wrong number of arguments(' + given + ' for ' + expected + ')');
257
+ };
258
+
259
+ // Boot a base class (makes instances).
260
+ function boot_defclass(superklass) {
261
+ var cls = function() {
262
+ this.$id = unique_id++;
263
+
264
+ return this;
265
+ };
266
+
267
+ if (superklass) {
268
+ var ctor = function() {};
269
+ ctor.prototype = superklass.prototype;
270
+
271
+ cls.prototype = new ctor();
272
+ }
273
+
274
+ cls.prototype.constructor = cls;
275
+ cls.prototype.$flags = T_OBJECT;
276
+
277
+ return cls;
278
+ }
279
+
280
+ // Boot actual (meta classes) of core objects.
281
+ function boot_makemeta(id, klass, superklass) {
282
+ var meta = function() {
283
+ this.$id = unique_id++;
284
+
285
+ return this;
286
+ };
287
+
288
+ var ctor = function() {};
289
+ ctor.prototype = superklass.prototype;
290
+
291
+ meta.prototype = new ctor();
292
+
293
+ var proto = meta.prototype;
294
+ proto.$included_in = [];
295
+ proto.$allocator = klass;
296
+ proto.$flags = T_CLASS;
297
+ proto.$name = id;
298
+ proto.$s = superklass;
299
+ proto.constructor = meta;
300
+
301
+ var result = new meta();
302
+ klass.prototype.$klass = result;
303
+ result.$proto = klass.prototype;
304
+
305
+ return result;
306
+ }
307
+
308
+ // Create generic class with given superclass.
309
+ function boot_class(superklass) {
310
+ // instances
311
+ var cls = function() {
312
+ this.$id = unique_id++;
313
+
314
+ return this;
315
+ };
316
+
317
+ var ctor = function() {};
318
+ ctor.prototype = superklass.$allocator.prototype;
319
+
320
+ cls.prototype = new ctor();
321
+
322
+ var proto = cls.prototype;
323
+ proto.constructor = cls;
324
+ proto.$flags = T_OBJECT;
325
+
326
+ // class itself
327
+ var meta = function() {
328
+ this.$id = unique_id++;
329
+
330
+ return this;
331
+ };
332
+
333
+ var mtor = function() {};
334
+ mtor.prototype = superklass.constructor.prototype;
335
+
336
+ meta.prototype = new mtor();
337
+
338
+ proto = meta.prototype;
339
+ proto.$allocator = cls;
340
+ proto.$flags = T_CLASS;
341
+ proto.constructor = meta;
342
+ proto.$s = superklass;
343
+
344
+ var result = new meta();
345
+ cls.prototype.$klass = result;
346
+
347
+ result.$proto = cls.prototype;
348
+
349
+ return result;
350
+ }
351
+
352
+ function boot_module() {
353
+ // where module "instance" methods go. will never be instantiated so it
354
+ // can be a regular object
355
+ var module_cons = function(){};
356
+ var module_inst = module_cons.prototype;
357
+
358
+ // Module itself
359
+ var meta = function() {
360
+ this.$id = unique_id++;
361
+ return this;
362
+ };
363
+
364
+ var mtor = function(){};
365
+ mtor.prototype = RubyModule.constructor.prototype;
366
+ meta.prototype = new mtor();
367
+
368
+ var proto = meta.prototype;
369
+ proto.$allocator = module_cons;
370
+ proto.$flags = T_MODULE;
371
+ proto.constructor = meta;
372
+ proto.$s = RubyModule;
373
+
374
+ var module = new meta();
375
+ module.$proto = module_inst;
376
+
377
+ return module;
378
+ }
379
+
380
+ // Get actual class ignoring singleton classes and iclasses.
381
+ function class_real(klass) {
382
+ while (klass.$flags & FL_SINGLETON) {
383
+ klass = klass.$s;
384
+ }
385
+
386
+ return klass;
387
+ }
388
+
389
+ // Make metaclass for the given class
390
+ function make_metaclass(klass, superklass) {
391
+ if (klass.$flags & T_CLASS) {
392
+ if ((klass.$flags & T_CLASS) && (klass.$flags & FL_SINGLETON)) {
393
+ throw RubyException.$new('too much meta: return klass?');
394
+ }
395
+ else {
396
+ var class_id = "#<Class:" + klass.$name + ">",
397
+ meta = boot_class(superklass);
398
+
399
+ meta.$name = class_id;
400
+ meta.$allocator.prototype = klass.constructor.prototype;
401
+ meta.$flags |= FL_SINGLETON;
402
+
403
+ klass.$klass = meta;
404
+
405
+ meta.$const = klass.$const;
406
+ meta.__attached__ = klass;
407
+
408
+ return meta;
409
+ }
410
+ }
411
+ else {
412
+ return make_singleton_class(klass);
413
+ }
414
+ }
415
+
416
+ function make_singleton_class(obj) {
417
+ var orig_class = obj.$klass,
418
+ class_id = "#<Class:#<" + orig_class.$name + ":" + orig_class.$id + ">>";
419
+
420
+ klass = boot_class(orig_class);
421
+ klass.$name = class_id;
422
+
423
+ klass.$flags |= FL_SINGLETON;
424
+ klass.$bridge_prototype = obj;
425
+
426
+ obj.$klass = klass;
427
+
428
+ klass.__attached__ = obj;
429
+
430
+ klass.$klass = class_real(orig_class).$k;
431
+
432
+ return klass;
433
+ }
434
+
435
+ function bridge_class(constructor, flags, id) {
436
+ var klass = define_class(RubyObject, id, RubyObject),
437
+ prototype = constructor.prototype;
438
+
439
+ klass.$allocator = constructor;
440
+ klass.$proto = prototype;
441
+
442
+ bridged_classes.push(klass);
443
+
444
+ prototype.$klass = klass;
445
+ prototype.$flags = flags;
446
+
447
+ return klass;
448
+ }
449
+
450
+ // Define new ruby class
451
+ function define_class(base, id, superklass) {
452
+ var klass;
453
+
454
+ var class_id = (base === RubyObject ? id : base.$name + '::' + id);
455
+
456
+ klass = boot_class(superklass);
457
+ klass.$name = class_id;
458
+
459
+ make_metaclass(klass, superklass.$klass);
460
+
461
+ var const_alloc = function() {};
462
+ var const_scope = const_alloc.prototype = new base.$const.alloc();
463
+ klass.$const = const_scope;
464
+ const_scope.alloc = const_alloc;
465
+
466
+ base.$const[id] = klass;
467
+
468
+ if (superklass.$inherited) {
469
+ superklass.$inherited(klass);
470
+ }
471
+
472
+ return klass;
473
+ }
474
+
475
+ // Get singleton class of obj
476
+ function singleton_class(obj) {
477
+ var klass;
478
+
479
+ if (obj.$flags & T_OBJECT) {
480
+ if ((obj.$flags & T_NUMBER) || (obj.$flags & T_STRING)) {
481
+ throw RubyTypeError.$new("can't define singleton");
482
+ }
483
+ }
484
+
485
+ if ((obj.$klass.$flags & FL_SINGLETON) && obj.$klass.__attached__ == obj) {
486
+ klass = obj.$klass;
487
+ }
488
+ else {
489
+ var class_id = obj.$klass.$name;
490
+
491
+ klass = make_metaclass(obj, obj.$klass);
492
+ }
493
+
494
+ return klass;
495
+ }
496
+
497
+ opal.main = function(id) {
498
+ opal.gvars.$0 = find_lib(id);
499
+
500
+ try {
501
+ top_self.$require(id);
502
+
503
+ opal.do_at_exit();
504
+ }
505
+ catch (e) {
506
+ // this is defined in debug.js
507
+ console.log(e.$klass.$name + ': ' + e.message);
508
+ console.log("\t" + e.$backtrace().join("\n\t"));
509
+ }
510
+ };
511
+
512
+ /**
513
+ * Register a standard file. This can be used to register non-lib files.
514
+ * For example, specs can be registered here so they are available.
515
+ *
516
+ * NOTE: Files should be registered as a full path with given factory.
517
+ *
518
+ * Usage:
519
+ *
520
+ * opal.file('/spec/foo.rb': function() {
521
+ * // ...
522
+ * });
523
+ */
524
+ opal.file = function(file, factory) {
525
+ FACTORIES[file] = factory;
526
+ };
527
+
528
+ /**
529
+ * Register a lib.
530
+ *
531
+ * Usage:
532
+ *
533
+ * opal.lib('my_lib', function() {
534
+ * // ...
535
+ * });
536
+ *
537
+ * opal.lib('my_lib/foo', function() {
538
+ * // ...
539
+ * });
540
+ */
541
+ opal.lib = function(lib, factory) {
542
+ var file = '/lib/' + lib + '.rb';
543
+ FACTORIES[file] = factory;
544
+ LIBS[lib] = file;
545
+ };
546
+
547
+ var FACTORIES = {},
548
+ FEATURES = [],
549
+ LIBS = {},
550
+ LOADER_PATHS = ['', '/lib'],
551
+ LOADER_CACHE = {};
552
+
553
+ function find_lib(id) {
554
+ var path;
555
+
556
+ // try to load a lib path first - i.e. something in our load path
557
+ if (path = LIBS[id]) return path;
558
+
559
+ // find '/opal/x' style libs
560
+ if (path = LIBS['opal/' + id]) return path;
561
+
562
+ // next, incase our require() has a ruby extension..
563
+ if (FACTORIES['/lib/' +id]) return '/lib/' + id;
564
+
565
+ // check if id is full path..
566
+ if (FACTORIES[id]) return id;
567
+
568
+ // full path without '.rb'
569
+ if (FACTORIES[id + '.rb']) return id + '.rb';
570
+
571
+ // check in current working directory.
572
+ var in_cwd = FS_CWD + '/' + id;
573
+
574
+ if (FACTORIES[in_cwd]) return in_cwd;
575
+ };
576
+
577
+ // Current working directory
578
+ var FS_CWD = '/';
579
+
580
+ // Turns a glob string into a regexp
581
+
582
+ // Initialization
583
+ // --------------
584
+
585
+ // The *instances* of core objects
586
+ var BootObject = boot_defclass();
587
+ var BootModule = boot_defclass(BootObject);
588
+ var BootClass = boot_defclass(BootModule);
589
+
590
+ // The *classes' of core objects
591
+ var RubyObject = boot_makemeta('Object', BootObject, BootClass);
592
+ var RubyModule = boot_makemeta('Module', BootModule, RubyObject.constructor);
593
+ var RubyClass = boot_makemeta('Class', BootClass, RubyModule.constructor);
594
+
595
+ // Fix boot classes to use meta class
596
+ RubyObject.$klass = RubyClass;
597
+ RubyModule.$klass = RubyClass;
598
+ RubyClass.$klass = RubyClass;
599
+
600
+ // fix superclasses
601
+ RubyObject.$s = null;
602
+ RubyModule.$s = RubyObject;
603
+ RubyClass.$s = RubyModule;
604
+
605
+ opal.Object = RubyObject;
606
+ opal.Module = RubyModule;
607
+ opal.Class = RubyClass;
608
+
609
+ // make object act like a module
610
+ var bridged_classes = RubyObject.$included_in = [];
611
+
612
+ // Top level Object scope (used by object and top_self).
613
+ var top_const_alloc = function(){};
614
+ var top_const_scope = top_const_alloc.prototype;
615
+ top_const_scope.alloc = top_const_alloc;
616
+
617
+ RubyObject.$const = opal.constants = top_const_scope;
618
+
619
+ var module_const_alloc = function(){};
620
+ var module_const_scope = new top_const_alloc();
621
+ module_const_scope.alloc = module_const_alloc;
622
+ RubyModule.$const = module_const_scope;
623
+
624
+ var class_const_alloc = function(){};
625
+ var class_const_scope = new top_const_alloc();
626
+ class_const_scope.alloc = class_const_alloc;
627
+ RubyClass.$const = class_const_scope;
628
+
629
+ RubyObject.$const.BasicObject = RubyObject;
630
+ RubyObject.$const.Object = RubyObject;
631
+ RubyObject.$const.Module = RubyModule;
632
+ RubyObject.$const.Class = RubyClass;
633
+
634
+ var top_self = opal.top = new RubyObject.$allocator();
635
+
636
+ var RubyNilClass = define_class(RubyObject, 'NilClass', RubyObject);
637
+ var nil = opal.nil = new RubyNilClass.$allocator();
638
+
639
+ bridge_class(Array, T_OBJECT | T_ARRAY, 'Array');
640
+ bridge_class(Number, T_OBJECT | T_NUMBER, 'Numeric');
641
+
642
+ bridge_class(String, T_OBJECT | T_STRING, 'String');
643
+ bridge_class(Boolean, T_OBJECT | T_BOOLEAN, 'Boolean');
644
+ bridge_class(Function, T_OBJECT | T_PROC, 'Proc');
645
+ bridge_class(RegExp, T_OBJECT, 'Regexp');
646
+
647
+ var RubyMatch = define_class(RubyObject, 'MatchData', RubyObject);
648
+ var RubyRange = define_class(RubyObject, 'Range', RubyObject);
649
+
650
+ var RubyException = bridge_class(Error, T_OBJECT, 'Exception');
651
+ var RubyStandardError = define_class(RubyObject, 'StandardError', RubyException);
652
+ var RubyRuntimeError = define_class(RubyObject, 'RuntimeError', RubyException);
653
+ var RubyLocalJumpError = define_class(RubyObject, 'LocalJumpError', RubyStandardError);
654
+ var RubyTypeError = define_class(RubyObject, 'TypeError', RubyStandardError);
655
+ var RubyNameError = define_class(RubyObject, 'NameError', RubyStandardError);
656
+ var RubyNoMethodError = define_class(RubyObject, 'NoMethodError', RubyNameError);
657
+ var RubyArgError = define_class(RubyObject, 'ArgumentError', RubyStandardError);
658
+ var RubyScriptError = define_class(RubyObject, 'ScriptError', RubyException);
659
+ var RubyLoadError = define_class(RubyObject, 'LoadError', RubyScriptError);
660
+ var RubyIndexError = define_class(RubyObject, 'IndexError', RubyStandardError);
661
+ var RubyKeyError = define_class(RubyObject, 'KeyError', RubyIndexError);
662
+ var RubyRangeError = define_class(RubyObject, 'RangeError', RubyStandardError);
663
+ var RubyNotImplError = define_class(RubyObject, 'NotImplementedError', RubyException);
664
+
665
+ RubyException.$allocator.prototype.toString = function() {
666
+ return this.$klass.$name + ': ' + this.message;
667
+ };
668
+
669
+ var breaker = opal.breaker = new Error('unexpected break');
670
+ breaker.$klass = RubyLocalJumpError;
671
+ breaker.$t = function() { throw this; };
672
+