opal 0.3.2 → 0.3.6

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