opal 0.3.2 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. data/README.md +85 -127
  2. data/bin/opal +3 -3
  3. data/lib/core.rb +114 -0
  4. data/{gems/core/lib → lib}/core/array.rb +68 -187
  5. data/{gems/core/lib → lib}/core/basic_object.rb +22 -5
  6. data/lib/core/class.rb +38 -0
  7. data/{gems/core/lib → lib}/core/dir.rb +1 -1
  8. data/lib/core/enumerable.rb +33 -0
  9. data/{gems/core/lib → lib}/core/error.rb +1 -4
  10. data/{gems/core/lib → lib}/core/false_class.rb +0 -0
  11. data/{gems/core/lib → lib}/core/file.rb +11 -3
  12. data/{gems/core/lib → lib}/core/hash.rb +12 -0
  13. data/{gems/core/lib → lib}/core/kernel.rb +114 -86
  14. data/lib/core/match_data.rb +33 -0
  15. data/lib/core/module.rb +97 -0
  16. data/{gems/core/lib → lib}/core/nil_class.rb +0 -0
  17. data/{gems/core/lib → lib}/core/numeric.rb +5 -0
  18. data/{gems/core/lib → lib}/core/object.rb +0 -0
  19. data/{gems/core/lib → lib}/core/proc.rb +13 -3
  20. data/{gems/core/lib → lib}/core/range.rb +10 -0
  21. data/{gems/core/lib → lib}/core/regexp.rb +33 -1
  22. data/{gems/core/lib → lib}/core/string.rb +25 -10
  23. data/{gems/core/lib → lib}/core/symbol.rb +3 -3
  24. data/{gems/core/lib → lib}/core/top_self.rb +0 -0
  25. data/{gems/core/lib → lib}/core/true_class.rb +0 -0
  26. data/lib/dev.rb +169 -0
  27. data/{gems/ospec/lib → lib}/ospec.rb +1 -0
  28. data/lib/ospec/autorun.rb +8 -0
  29. data/{gems/ospec/lib → lib}/ospec/dsl.rb +2 -2
  30. data/{gems/ospec/lib → lib}/ospec/example.rb +0 -0
  31. data/{gems/ospec/lib → lib}/ospec/example/before_and_after_hooks.rb +0 -0
  32. data/{gems/ospec/lib → lib}/ospec/example/errors.rb +0 -0
  33. data/{gems/ospec/lib → lib}/ospec/example/example_group.rb +0 -0
  34. data/{gems/ospec/lib → lib}/ospec/example/example_group_factory.rb +0 -3
  35. data/{gems/ospec/lib → lib}/ospec/example/example_group_hierarchy.rb +4 -3
  36. data/{gems/ospec/lib → lib}/ospec/example/example_group_methods.rb +1 -1
  37. data/{gems/ospec/lib → lib}/ospec/example/example_group_proxy.rb +3 -2
  38. data/{gems/ospec/lib → lib}/ospec/example/example_methods.rb +1 -1
  39. data/{gems/ospec/lib → lib}/ospec/example/example_proxy.rb +7 -7
  40. data/{gems/ospec/lib → lib}/ospec/expectations.rb +0 -0
  41. data/{gems/ospec/lib → lib}/ospec/expectations/errors.rb +0 -0
  42. data/{gems/ospec/lib → lib}/ospec/expectations/fail_with.rb +4 -3
  43. data/{gems/ospec/lib → lib}/ospec/expectations/handler.rb +6 -0
  44. data/lib/ospec/helpers/scratch.rb +18 -0
  45. data/{gems/ospec/lib → lib}/ospec/matchers.rb +2 -2
  46. data/{gems/ospec/lib → lib}/ospec/matchers/be.rb +0 -0
  47. data/{gems/ospec/lib → lib}/ospec/matchers/generated_descriptions.rb +0 -0
  48. data/{gems/ospec/lib → lib}/ospec/matchers/operator_matcher.rb +2 -0
  49. data/lib/ospec/matchers/raise_error.rb +38 -0
  50. data/lib/ospec/runner.rb +90 -0
  51. data/{gems/ospec/lib → lib}/ospec/runner/example_group_runner.rb +10 -13
  52. data/lib/ospec/runner/formatter/html_formatter.rb +139 -0
  53. data/{gems/ospec/lib → lib}/ospec/runner/formatter/terminal_formatter.rb +0 -0
  54. data/{gems/ospec/lib → lib}/ospec/runner/options.rb +1 -3
  55. data/{gems/ospec/lib → lib}/ospec/runner/reporter.rb +0 -9
  56. data/lib/racc/parser.rb +165 -0
  57. data/lib/strscan.rb +52 -0
  58. data/{lib → opal_lib}/opal.rb +2 -0
  59. data/opal_lib/opal/build_methods.rb +51 -0
  60. data/opal_lib/opal/builder.rb +164 -0
  61. data/opal_lib/opal/bundle.rb +70 -0
  62. data/opal_lib/opal/command.rb +68 -0
  63. data/{lib → opal_lib}/opal/context.rb +21 -9
  64. data/{lib → opal_lib}/opal/context/console.rb +0 -2
  65. data/opal_lib/opal/context/file_system.rb +34 -0
  66. data/{lib → opal_lib}/opal/context/loader.rb +26 -8
  67. data/opal_lib/opal/gem.rb +84 -0
  68. data/{lib → opal_lib}/opal/rake/builder_task.rb +2 -2
  69. data/opal_lib/opal/rake/spec_task.rb +32 -0
  70. data/{lib → opal_lib}/opal/ruby/nodes.rb +730 -109
  71. data/{lib → opal_lib}/opal/ruby/parser.rb +90 -23
  72. data/opal_lib/opal/ruby/ruby_parser.rb +4862 -0
  73. data/opal_lib/opal/ruby/ruby_parser.y +1454 -0
  74. data/opal_lib/opal/version.rb +4 -0
  75. data/runtime/class.js +359 -0
  76. data/runtime/debug.js +84 -0
  77. data/runtime/fs.js +199 -0
  78. data/runtime/init.js +558 -0
  79. data/runtime/loader.js +351 -0
  80. data/runtime/module.js +109 -0
  81. data/runtime/post.js +10 -0
  82. data/runtime/pre.js +7 -0
  83. data/runtime/runtime.js +351 -0
  84. metadata +88 -175
  85. data/.gitignore +0 -7
  86. data/Changelog +0 -31
  87. data/LICENSE +0 -75
  88. data/Rakefile +0 -86
  89. data/gems/core/README.md +0 -14
  90. data/gems/core/Rakefile +0 -8
  91. data/gems/core/core.gemspec +0 -13
  92. data/gems/core/lib/core.rb +0 -34
  93. data/gems/core/lib/core/class.rb +0 -31
  94. data/gems/core/lib/core/module.rb +0 -100
  95. data/gems/core/lib/core/vm.rb +0 -16
  96. data/gems/core/spec/core/array/append_spec.rb +0 -30
  97. data/gems/core/spec/core/array/assoc_spec.rb +0 -29
  98. data/gems/core/spec/core/array/at_spec.rb +0 -37
  99. data/gems/core/spec/core/array/clear_spec.rb +0 -22
  100. data/gems/core/spec/core/array/collect_bang_spec.rb +0 -27
  101. data/gems/core/spec/core/array/collect_spec.rb +0 -27
  102. data/gems/core/spec/core/array/compact_spec.rb +0 -41
  103. data/gems/core/spec/core/array/concat_spec.rb +0 -15
  104. data/gems/core/spec/core/array/constructor_spec.rb +0 -14
  105. data/gems/core/spec/core/array/each_spec.rb +0 -9
  106. data/gems/core/spec/core/array/element_reference_spec.rb +0 -4
  107. data/gems/core/spec/core/array/first_spec.rb +0 -35
  108. data/gems/core/spec/core/array/include_spec.rb +0 -9
  109. data/gems/core/spec/core/array/join_spec.rb +0 -6
  110. data/gems/core/spec/core/array/last_spec.rb +0 -51
  111. data/gems/core/spec/core/array/length_spec.rb +0 -6
  112. data/gems/core/spec/core/array/map_spec.rb +0 -33
  113. data/gems/core/spec/core/array/reverse_spec.rb +0 -6
  114. data/gems/core/spec/core/builtin_constants/builtin_constants_spec.rb +0 -7
  115. data/gems/core/spec/core/false/and_spec.rb +0 -10
  116. data/gems/core/spec/core/false/inspect_spec.rb +0 -6
  117. data/gems/core/spec/core/false/or_spec.rb +0 -10
  118. data/gems/core/spec/core/false/to_s_spec.rb +0 -6
  119. data/gems/core/spec/core/false/xor_spec.rb +0 -10
  120. data/gems/core/spec/core/file/join_spec.rb +0 -19
  121. data/gems/core/spec/core/hash/assoc_spec.rb +0 -32
  122. data/gems/core/spec/core/kernel/instance_eval_spec.rb +0 -0
  123. data/gems/core/spec/core/kernel/loop_spec.rb +0 -24
  124. data/gems/core/spec/core/kernel/raise_spec.rb +0 -0
  125. data/gems/core/spec/core/module/attr_accessor_spec.rb +0 -28
  126. data/gems/core/spec/core/number/lt_spec.rb +0 -12
  127. data/gems/core/spec/core/string/sub_spec.rb +0 -24
  128. data/gems/core/spec/core/true/and_spec.rb +0 -10
  129. data/gems/core/spec/core/true/inspect_spec.rb +0 -6
  130. data/gems/core/spec/core/true/or_spec.rb +0 -10
  131. data/gems/core/spec/core/true/to_s_spec.rb +0 -6
  132. data/gems/core/spec/core/true/xor_spec.rb +0 -10
  133. data/gems/core/spec/language/and_spec.rb +0 -61
  134. data/gems/core/spec/language/array_spec.rb +0 -68
  135. data/gems/core/spec/language/block_spec.rb +0 -38
  136. data/gems/core/spec/language/break_spec.rb +0 -36
  137. data/gems/core/spec/language/case_spec.rb +0 -103
  138. data/gems/core/spec/language/def_spec.rb +0 -21
  139. data/gems/core/spec/language/eigenclass_spec.rb +0 -60
  140. data/gems/core/spec/language/file_spec.rb +0 -13
  141. data/gems/core/spec/language/fixtures/block.rb +0 -21
  142. data/gems/core/spec/language/fixtures/super.rb +0 -293
  143. data/gems/core/spec/language/hash_spec.rb +0 -29
  144. data/gems/core/spec/language/if_spec.rb +0 -54
  145. data/gems/core/spec/language/loop_spec.rb +0 -11
  146. data/gems/core/spec/language/metaclass_spec.rb +0 -21
  147. data/gems/core/spec/language/method_spec.rb +0 -124
  148. data/gems/core/spec/language/next_spec.rb +0 -25
  149. data/gems/core/spec/language/or_spec.rb +0 -34
  150. data/gems/core/spec/language/redo_spec.rb +0 -24
  151. data/gems/core/spec/language/regexp_spec.rb +0 -26
  152. data/gems/core/spec/language/rescue_spec.rb +0 -20
  153. data/gems/core/spec/language/return_spec.rb +0 -47
  154. data/gems/core/spec/language/string_spec.rb +0 -25
  155. data/gems/core/spec/language/super_spec.rb +0 -32
  156. data/gems/core/spec/language/until_spec.rb +0 -157
  157. data/gems/core/spec/language/variables_spec.rb +0 -155
  158. data/gems/core/spec/language/while_spec.rb +0 -163
  159. data/gems/core/spec/spec_helper.rb +0 -5
  160. data/gems/core_fs/README.md +0 -19
  161. data/gems/dev/Rakefile +0 -5
  162. data/gems/dev/lib/dev.js +0 -99
  163. data/gems/dev/lib/dev/generator.js +0 -1264
  164. data/gems/dev/lib/dev/parser.js +0 -979
  165. data/gems/dev/lib/dev/ruby_parser.js +0 -1088
  166. data/gems/dev/lib/dev/ruby_parser.y +0 -1267
  167. data/gems/dev/lib/dev/string_scanner.js +0 -38
  168. data/gems/dev/tools/racc2js/README.md +0 -39
  169. data/gems/dev/tools/racc2js/math_parser.js +0 -222
  170. data/gems/dev/tools/racc2js/math_parser.rb +0 -133
  171. data/gems/dev/tools/racc2js/math_parser.y +0 -28
  172. data/gems/dev/tools/racc2js/parser.js +0 -218
  173. data/gems/dev/tools/racc2js/racc2js.rb +0 -153
  174. data/gems/json/README.md +0 -4
  175. data/gems/json/json.gemspec +0 -14
  176. data/gems/json/lib/json.rb +0 -64
  177. data/gems/json/lib/json/ext.rb +0 -51
  178. data/gems/json/lib/json/json2.js +0 -481
  179. data/gems/ospec/README.md +0 -0
  180. data/gems/ospec/lib/ospec/autorun.rb +0 -3
  181. data/gems/ospec/lib/ospec/runner.rb +0 -40
  182. data/gems/ospec/lib/ospec/runner/formatter/html_formatter.rb +0 -91
  183. data/gems/ospec/ospec.gemspec +0 -0
  184. data/gems/rquery/README.md +0 -9
  185. data/gems/rquery/lib/rquery.rb +0 -10
  186. data/gems/rquery/lib/rquery/ajax.rb +0 -4
  187. data/gems/rquery/lib/rquery/css.rb +0 -96
  188. data/gems/rquery/lib/rquery/document.rb +0 -25
  189. data/gems/rquery/lib/rquery/element.rb +0 -292
  190. data/gems/rquery/lib/rquery/event.rb +0 -108
  191. data/gems/rquery/lib/rquery/jquery.js +0 -8177
  192. data/gems/rquery/lib/rquery/request.rb +0 -138
  193. data/gems/rquery/lib/rquery/response.rb +0 -49
  194. data/gems/rquery/rquery.gemspec +0 -16
  195. data/lib/opal.js +0 -1597
  196. data/lib/opal/builder.rb +0 -117
  197. data/lib/opal/bundle.rb +0 -131
  198. data/lib/opal/command.rb +0 -11
  199. data/lib/opal/context/file_system.rb +0 -19
  200. data/lib/opal/gem.rb +0 -153
  201. data/lib/opal/ruby/ruby_parser.rb +0 -5170
  202. data/lib/opal/ruby/ruby_parser.y +0 -1298
  203. data/opal.gemspec +0 -15
@@ -0,0 +1,4 @@
1
+ module Opal
2
+ VERSION = "0.3.2"
3
+ end
4
+
data/runtime/class.js ADDED
@@ -0,0 +1,359 @@
1
+ /**
2
+ Every class in opal is an instance of RClass
3
+
4
+ @param {RClass} klass
5
+ @param {RClass} superklass
6
+ */
7
+ var RClass = Rt.RClass = function(klass, superklass) {
8
+ this.$id = yield_hash();
9
+ this.$super = superklass;
10
+
11
+ if (superklass) {
12
+ var mtor = function() {};
13
+ mtor.prototype = new superklass.$m_tor();
14
+ this.$m_tbl = mtor.prototype;
15
+ this.$m_tor = mtor;
16
+
17
+ var cctor = function() {};
18
+ cctor.prototype = superklass.$c_prototype;
19
+
20
+ var c_tor = function(){};
21
+ c_tor.prototype = new cctor();
22
+
23
+ this.$c = new c_tor();
24
+ this.$c_prototype = c_tor.prototype;
25
+ }
26
+ else {
27
+ var mtor = function() {};
28
+ this.$m_tbl = mtor.prototype;
29
+ this.$m_tor = mtor;
30
+
31
+ var ctor = function() {};
32
+ this.$c = new ctor();
33
+ this.$c_prototype = ctor.prototype;
34
+ }
35
+
36
+ this.$method_table = {};
37
+ this.$const_table = {};
38
+
39
+ return this;
40
+ };
41
+
42
+ // RClass prototype for minimizing
43
+ var Rp = RClass.prototype;
44
+
45
+ /**
46
+ Every RClass instance is just a T_CLASS.
47
+ */
48
+ Rp.$flags = T_CLASS;
49
+
50
+ /**
51
+ RClass truthiness
52
+ */
53
+ Rp.$r = true;
54
+
55
+ /**
56
+ Every object in opal (except toll free objects) are instances of RObject
57
+
58
+ @param {RClass} klass
59
+ */
60
+ var RObject = Rt.RObject = function(klass) {
61
+ this.$id = yield_hash();
62
+ this.$klass = klass;
63
+ this.$m = klass.$m_tbl;
64
+ return this;
65
+ };
66
+
67
+ // For minimizing
68
+ var Bp = RObject.prototype;
69
+
70
+ /**
71
+ Every RObject is a T_OBJECT
72
+ */
73
+ Bp.$flags = T_OBJECT;
74
+
75
+ /**
76
+ RObject truthiness
77
+ */
78
+ Bp.$r = true;
79
+
80
+ /**
81
+ The hash of all objects and classes is sinple its id
82
+ */
83
+ Bp.$hash = Rp.$hash = function() {
84
+ return this.$id;
85
+ };
86
+
87
+ /**
88
+ Like boot_defclass but for root object only (i.e. BasicObject)
89
+ */
90
+ function boot_defrootclass(id) {
91
+ var cls = new RClass(null, null);
92
+ cls.$flags = T_CLASS;
93
+ name_class(cls, id);
94
+ const_set((cObject || cls), id, cls);
95
+ return cls;
96
+ }
97
+
98
+ /**
99
+ Boots core classes - Object, Module and Class
100
+ */
101
+ function boot_defclass(id, superklass) {
102
+ var cls = class_boot(superklass);
103
+ name_class(cls, id);
104
+ const_set((cObject || cls), id, cls);
105
+ return cls;
106
+ }
107
+
108
+ function class_boot(superklass) {
109
+ if (superklass) {
110
+ var ctor = function() {};
111
+ ctor.prototype = superklass.constructor.prototype;
112
+
113
+ var result = function() {
114
+ RClass.call(this, null, superklass);
115
+ return this;
116
+ };
117
+ result.prototype = new ctor();
118
+
119
+ var klass = new result();
120
+ klass.$klass = cClass;
121
+ return klass;
122
+ }
123
+ else {
124
+ var result = new RClass(null, null);
125
+ return result;
126
+ }
127
+ }
128
+
129
+ function class_real(klass) {
130
+ while (klass.$flags & FL_SINGLETON) { klass = klass.$super; }
131
+ return klass;
132
+ };
133
+
134
+ Rt.class_real = class_real;
135
+
136
+ /**
137
+ Name the class with the given id.
138
+ */
139
+ function name_class(klass, id) {
140
+ klass.__classid__ = id;
141
+ };
142
+
143
+ /**
144
+ Make metaclass for the given class
145
+ */
146
+ function make_metaclass(klass, super_class) {
147
+ if (klass.$flags & T_CLASS) {
148
+ if ((klass.$flags & T_CLASS) && (klass.$flags & FL_SINGLETON)) {
149
+ return make_metametaclass(klass);
150
+ }
151
+ else {
152
+ // FIXME this needs fixinfg to remove hacked stuff now in make_singleton_class
153
+ var meta = class_boot(super_class);
154
+ // remove this??!
155
+ meta.$m = meta.$klass.$m_tbl;
156
+ meta.$c = meta.$klass.$c_prototype;
157
+ meta.$flags |= FL_SINGLETON;
158
+ meta.__classid__ = "#<Class:" + klass.__classid__ + ">";
159
+ klass.$klass = meta;
160
+ klass.$m = meta.$m_tbl;
161
+ meta.$c = klass.$c;
162
+ singleton_class_attached(meta, klass);
163
+ // console.log("meta id: " + klass.__classid__);
164
+ return meta;
165
+ }
166
+ } else {
167
+ // if we want metaclass of an object, do this
168
+ return make_singleton_class(klass);
169
+ }
170
+ };
171
+
172
+ function make_singleton_class(obj) {
173
+ var orig_class = obj.$klass;
174
+ var klass = class_boot(orig_class);
175
+
176
+ klass.$flags |= FL_SINGLETON;
177
+
178
+ obj.$klass = klass;
179
+ obj.$m = klass.$m_tbl;
180
+
181
+ // make methods we define here actually point to instance
182
+ // FIXME: we could just take advantage of $bridge_prototype like we
183
+ // use for bridged classes?? means we can make more instances...
184
+ klass.$bridge_prototype = obj;
185
+
186
+ singleton_class_attached(klass, obj);
187
+
188
+ klass.$klass = class_real(orig_class).$klass;
189
+ klass.$m = klass.$klass.$m_tbl;
190
+ klass.__classid__ = "#<Class:#<" + orig_class.__classid__ + ":" + klass.$id + ">>";
191
+
192
+ return klass;
193
+ };
194
+
195
+ function singleton_class_attached(klass, obj) {
196
+ if (klass.$flags & FL_SINGLETON) {
197
+ klass.__attached__ = obj;
198
+ }
199
+ };
200
+
201
+ function make_metametaclass(metaclass) {
202
+ var metametaclass, super_of_metaclass;
203
+
204
+ if (metaclass.$klass == metaclass) {
205
+ metametaclass = class_boot(null);
206
+ metametaclass.$klass = metametaclass;
207
+ }
208
+ else {
209
+ metametaclass = class_boot(null);
210
+ metametaclass.$klass = metaclass.$klass.$klass == metaclass.$klass
211
+ ? make_metametaclass(metaclass.$klass)
212
+ : metaclass.$klass.$klass;
213
+ }
214
+
215
+ metametaclass.$flags |= FL_SINGLETON;
216
+
217
+ singleton_class_attached(metametaclass, metaclass);
218
+ metaclass.$klass = metametaclass;
219
+ metaclsss.$m = metametaclass.$m_tbl;
220
+ super_of_metaclass = metaclass.$super;
221
+
222
+ metametaclass.$super = super_of_metaclass.$klass.__attached__
223
+ == super_of_metaclass
224
+ ? super_of_metaclass.$klass
225
+ : make_metametaclass(super_of_metaclass);
226
+
227
+ return metametaclass;
228
+ };
229
+
230
+ function boot_defmetametaclass(klass, metametaclass) {
231
+ klass.$klass.$klass = metametaclass;
232
+ };
233
+
234
+ // Holds an array of all prototypes that are bridged. Any method defined on
235
+ // Object in ruby will also be added to the bridge classes.
236
+ var bridged_classes = [];
237
+
238
+ /**
239
+ Define toll free bridged class
240
+ */
241
+ function bridge_class(prototype, flags, id, super_class) {
242
+ var klass = define_class(id, super_class);
243
+
244
+ prototype.$klass = klass;
245
+ prototype.$m = klass.$m_tbl;
246
+ prototype.$flags = flags;
247
+ prototype.$r = true;
248
+
249
+ prototype.$hash = function() { return flags + '_' + this; };
250
+
251
+ return klass;
252
+ };
253
+
254
+ Rt.native_prototype = function(cls, proto) {
255
+ proto.$klass = cls;
256
+ proto.$m = cls.$m_tbl;
257
+ proto.$flags = T_OBJECT;
258
+ proto.$r = true;
259
+
260
+ proto.$hash = function() {
261
+ return this.$id || (this.$id = yield_hash());
262
+ };
263
+
264
+ return cls;
265
+ };
266
+
267
+ /**
268
+ Define a new class (normal way), with the given id and superclass. Will be
269
+ top level.
270
+ */
271
+ function define_class(id, super_klass) {
272
+ return define_class_under(cObject, id, super_klass);
273
+ };
274
+
275
+ function define_class_under(base, id, super_klass) {
276
+ var klass;
277
+
278
+ if (const_defined(base, id)) {
279
+ klass = const_get(base, id);
280
+
281
+ if (!(klass.$flags & T_CLASS)) {
282
+ throw new Error(id + " is not a class!");
283
+ }
284
+
285
+ if (klass.$super != super_klass && super_klass != cObject) {
286
+ throw new Error("Wrong superclass given for " + id);
287
+ }
288
+
289
+ return klass;
290
+ }
291
+
292
+ klass = define_class_id(id, super_klass);
293
+
294
+ if (base == cObject) {
295
+ name_class(klass, id);
296
+ } else {
297
+ name_class(klass, base.__classid__ + '::' + id);
298
+ }
299
+
300
+ const_set(base, id, klass);
301
+ klass.$parent = base;
302
+
303
+ // Class#inherited hook - here is a good place to call. We check method
304
+ // is actually defined first (incase we are calling it during boot). We
305
+ // can't do this earlier as an error will cause constant names not to be
306
+ // set etc (this is the last place before returning back to scope).
307
+ if (super_klass.m$inherited) {
308
+ super_klass.m$inherited(klass);
309
+ }
310
+
311
+ return klass;
312
+ };
313
+
314
+ Rt.define_class_under = define_class_under;
315
+
316
+ /**
317
+ Actually create class
318
+ */
319
+ function define_class_id(id, super_klass) {
320
+ var klass;
321
+
322
+ if (!super_klass) {
323
+ super_klass = cObject;
324
+ }
325
+ klass = class_create(super_klass);
326
+ name_class(klass, id);
327
+ make_metaclass(klass, super_klass.$klass);
328
+
329
+ return klass;
330
+ };
331
+
332
+ function class_create(super_klass) {
333
+ return class_boot(super_klass);
334
+ };
335
+
336
+ /**
337
+ Get singleton class of obj
338
+ */
339
+ function singleton_class(obj) {
340
+ var klass;
341
+
342
+ if (obj.$flags & T_OBJECT) {
343
+ if ((obj.$flags & T_NUMBER) || (obj.$flags & T_SYMBOL)) {
344
+ raise(eTypeError, "can't define singleton");
345
+ }
346
+ }
347
+
348
+ if ((obj.$klass.$flags & FL_SINGLETON) && obj.$klass.__attached__ == obj) {
349
+ klass = obj.$klass;
350
+ }
351
+ else {
352
+ var class_id = obj.$klass.__classid__;
353
+ klass = make_metaclass(obj, obj.$klass);
354
+ }
355
+
356
+ return klass;
357
+ };
358
+
359
+ Rt.singleton_class = singleton_class;
data/runtime/debug.js ADDED
@@ -0,0 +1,84 @@
1
+ // ..........................................................
2
+ // Debug Mode
3
+ //
4
+
5
+ var Db = {};
6
+
7
+ function init_debug() {
8
+ // replace define method with our wrapped version
9
+ var old_dm = Rt.dm;
10
+
11
+ Rt.dm = function(klass, name, public_body, arity) {
12
+ var debug_body = function() {
13
+ var res, len = arguments.length, arity = debug_body.$rbArity;
14
+
15
+ if (arity >= 0) {
16
+ if (arity != len - 1) {
17
+ raise(eArgError, "wrong number of arguments(" + (len - 1) + " for " + arity + ")");
18
+ }
19
+ }
20
+ else {
21
+ if ((-arity - 1) > len) {
22
+ console.log("raising for " + name + " " + len + " for " + arity);
23
+ raise(eArgError, "wrong number of arguments(" + len + " for " + arity + ")");
24
+ }
25
+ }
26
+
27
+ // push call onto stack
28
+ Db.push(klass, arguments[0], name, Array.prototype.slice.call(arguments, 1));
29
+
30
+ // check for block and pass it on
31
+ if (block.f == arguments.callee) {
32
+ block.f = public_body
33
+ }
34
+
35
+ res = public_body.apply(this, [].slice.call(arguments));
36
+
37
+ Db.pop();
38
+
39
+ return res;
40
+ };
41
+
42
+ public_body.$rbWrap = debug_body;
43
+
44
+ return old_dm(klass, name, debug_body, arity);
45
+ };
46
+
47
+ // replace super handler with wrapped version
48
+ var old_super = Rt.S;
49
+
50
+ Rt.S = function(callee, self, args) {
51
+ return old_super(callee.$rbWrap, self, args);
52
+ };
53
+
54
+ // stack trace - chrome/v8/gem/node support
55
+ if (Error.prepareStackTrace) {
56
+
57
+ }
58
+ else {
59
+
60
+ }
61
+ };
62
+
63
+
64
+ Db.stack = [];
65
+
66
+ Db.push = function(klass, object, method) {
67
+ this.stack.push({ klass: klass, object: object, method: method });
68
+ };
69
+
70
+ Db.pop = function() {
71
+ this.stack.pop();
72
+ };
73
+
74
+ // Returns string
75
+ Db.backtrace = function() {
76
+ var trace = [], stack = this.stack, frame;
77
+
78
+ for (var i = stack.length - 1; i >= 0; i--) {
79
+ frame = stack[i];
80
+ trace.push("\tfrom " + frame.klass.$m.inspect(frame.klass) + '#' + frame.method);
81
+ }
82
+
83
+ return trace.join("\n");
84
+ };
data/runtime/fs.js ADDED
@@ -0,0 +1,199 @@
1
+ // ..........................................................
2
+ // FILE SYSTEM
3
+ //
4
+
5
+ /**
6
+ FileSystem namespace. Overiden in gem and node.js contexts
7
+ */
8
+ var Fs = Op.fs = {};
9
+
10
+ /**
11
+ RegExp for splitting filenames into their dirname, basename and ext.
12
+ This currently only supports unix style filenames as this is what is
13
+ used internally when running in the browser.
14
+ */
15
+ var PATH_RE = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
16
+
17
+ /**
18
+ Holds the current cwd for the application.
19
+
20
+ @type {String}
21
+ */
22
+ Fs.cwd = '/';
23
+
24
+ /**
25
+ Join the given args using the default separator. The returned path
26
+ is not expanded.
27
+
28
+ @param {String} parts
29
+ @return {String}
30
+ */
31
+ function fs_join(parts) {
32
+ parts = [].slice.call(arguments, 0);
33
+ return parts.join('/');
34
+ }
35
+
36
+ /**
37
+ Normalize the given path by removing '..' and '.' parts etc.
38
+
39
+ @param {String} path Path to normalize
40
+ @param {String} base Optional base to normalize with
41
+ @return {String}
42
+ */
43
+ function fs_expand_path(path, base) {
44
+ if (!base) {
45
+ if (path.charAt(0) !== '/') {
46
+ base = Fs.cwd;
47
+ }
48
+ else {
49
+ base = '';
50
+ }
51
+ }
52
+
53
+ path = fs_join(base, path);
54
+
55
+ var parts = path.split('/'), result = [], part;
56
+
57
+ // initial /
58
+ if (parts[0] === '') result.push('');
59
+
60
+ for (var i = 0, ii = parts.length; i < ii; i++) {
61
+ part = parts[i];
62
+
63
+ if (part == '..') {
64
+ result.pop();
65
+ }
66
+ else if (part == '.' || part == '') {
67
+
68
+ }
69
+ else {
70
+ result.push(part);
71
+ }
72
+ }
73
+
74
+ return result.join('/');
75
+ }
76
+
77
+ /**
78
+ Return all of the path components except the last one.
79
+
80
+ @param {String} path
81
+ @return {String}
82
+ */
83
+ var fs_dirname = Fs.dirname = function(path) {
84
+ var dirname = PATH_RE.exec(path)[1];
85
+
86
+ if (!dirname) return '.';
87
+ else if (dirname === '/') return dirname;
88
+ else return dirname.substring(0, dirname.length - 1);
89
+ };
90
+
91
+ /**
92
+ Returns the file extension of the given `file_name`.
93
+
94
+ @param {String} file_name
95
+ @return {String}
96
+ */
97
+ Fs.extname = function(file_name) {
98
+ var extname = PATH_RE.exec(file_name)[3];
99
+
100
+ if (!extname || extname === '.') return '';
101
+ else return extname;
102
+ };
103
+
104
+ Fs.exist_p = function(path) {
105
+ return opal.loader.factories[file_expand_path(path)] ? true : false;
106
+ };
107
+
108
+ /**
109
+ Glob
110
+ */
111
+ Fs.glob = function() {
112
+ var globs = [].slice.call(arguments);
113
+
114
+ var result = [], files = opal.loader.factories;
115
+
116
+ for (var i = 0, ii = globs.length; i < ii; i++) {
117
+ var glob = globs[i];
118
+
119
+ var re = fs_glob_to_regexp(glob);
120
+ // console.log("glob: " + glob);
121
+ // console.log("re : " + re);
122
+
123
+ for (var file in files) {
124
+ if (re.exec(file)) {
125
+ result.push(file);
126
+ }
127
+ }
128
+ }
129
+
130
+ return result;
131
+ };
132
+
133
+ /**
134
+ Turns a glob string into a regexp
135
+ */
136
+ function fs_glob_to_regexp(glob) {
137
+ if (typeof glob !== 'string') {
138
+ throw new Error("file_glob_to_regexp: glob must be a string");
139
+ }
140
+
141
+ // make sure absolute
142
+ glob = fs_expand_path(glob);
143
+ // console.log("full glob is: " + glob);
144
+
145
+ var parts = glob.split(''), length = parts.length, result = '';
146
+
147
+ var opt_group_stack = 0;
148
+
149
+ for (var i = 0; i < length; i++) {
150
+ var cur = parts[i];
151
+
152
+ switch (cur) {
153
+ case '*':
154
+ if (parts[i + 1] == '*') {
155
+ result += '.*';
156
+ i++;
157
+ }
158
+ else {
159
+ result += '[^/]*';
160
+ }
161
+ break;
162
+
163
+ case '.':
164
+ result += '\\';
165
+ result += cur;
166
+ break;
167
+
168
+ case ',':
169
+ if (opt_group_stack) {
170
+ result += '|';
171
+ }
172
+ else {
173
+ result += ',';
174
+ }
175
+ break;
176
+
177
+ case '{':
178
+ result += '(';
179
+ opt_group_stack++;
180
+ break;
181
+
182
+ case '}':
183
+ if (opt_group_stack) {
184
+ result += ')';
185
+ opt_group_stack--;
186
+ }
187
+ else {
188
+ result += '}'
189
+ }
190
+ break;
191
+
192
+ default:
193
+ result += cur;
194
+ }
195
+ }
196
+
197
+ return new RegExp('^' + result + '$');
198
+ };
199
+