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.
- data/README.md +85 -127
- data/bin/opal +3 -3
- data/lib/core.rb +114 -0
- data/{gems/core/lib → lib}/core/array.rb +68 -187
- data/{gems/core/lib → lib}/core/basic_object.rb +22 -5
- data/lib/core/class.rb +38 -0
- data/{gems/core/lib → lib}/core/dir.rb +1 -1
- data/lib/core/enumerable.rb +33 -0
- data/{gems/core/lib → lib}/core/error.rb +1 -4
- data/{gems/core/lib → lib}/core/false_class.rb +0 -0
- data/{gems/core/lib → lib}/core/file.rb +11 -3
- data/{gems/core/lib → lib}/core/hash.rb +12 -0
- data/{gems/core/lib → lib}/core/kernel.rb +114 -86
- data/lib/core/match_data.rb +33 -0
- data/lib/core/module.rb +97 -0
- data/{gems/core/lib → lib}/core/nil_class.rb +0 -0
- data/{gems/core/lib → lib}/core/numeric.rb +5 -0
- data/{gems/core/lib → lib}/core/object.rb +0 -0
- data/{gems/core/lib → lib}/core/proc.rb +13 -3
- data/{gems/core/lib → lib}/core/range.rb +10 -0
- data/{gems/core/lib → lib}/core/regexp.rb +33 -1
- data/{gems/core/lib → lib}/core/string.rb +25 -10
- data/{gems/core/lib → lib}/core/symbol.rb +3 -3
- data/{gems/core/lib → lib}/core/top_self.rb +0 -0
- data/{gems/core/lib → lib}/core/true_class.rb +0 -0
- data/lib/dev.rb +169 -0
- data/{gems/ospec/lib → lib}/ospec.rb +1 -0
- data/lib/ospec/autorun.rb +8 -0
- data/{gems/ospec/lib → lib}/ospec/dsl.rb +2 -2
- data/{gems/ospec/lib → lib}/ospec/example.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/example/before_and_after_hooks.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/example/errors.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/example/example_group.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/example/example_group_factory.rb +0 -3
- data/{gems/ospec/lib → lib}/ospec/example/example_group_hierarchy.rb +4 -3
- data/{gems/ospec/lib → lib}/ospec/example/example_group_methods.rb +1 -1
- data/{gems/ospec/lib → lib}/ospec/example/example_group_proxy.rb +3 -2
- data/{gems/ospec/lib → lib}/ospec/example/example_methods.rb +1 -1
- data/{gems/ospec/lib → lib}/ospec/example/example_proxy.rb +7 -7
- data/{gems/ospec/lib → lib}/ospec/expectations.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/expectations/errors.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/expectations/fail_with.rb +4 -3
- data/{gems/ospec/lib → lib}/ospec/expectations/handler.rb +6 -0
- data/lib/ospec/helpers/scratch.rb +18 -0
- data/{gems/ospec/lib → lib}/ospec/matchers.rb +2 -2
- data/{gems/ospec/lib → lib}/ospec/matchers/be.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/matchers/generated_descriptions.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/matchers/operator_matcher.rb +2 -0
- data/lib/ospec/matchers/raise_error.rb +38 -0
- data/lib/ospec/runner.rb +90 -0
- data/{gems/ospec/lib → lib}/ospec/runner/example_group_runner.rb +10 -13
- data/lib/ospec/runner/formatter/html_formatter.rb +139 -0
- data/{gems/ospec/lib → lib}/ospec/runner/formatter/terminal_formatter.rb +0 -0
- data/{gems/ospec/lib → lib}/ospec/runner/options.rb +1 -3
- data/{gems/ospec/lib → lib}/ospec/runner/reporter.rb +0 -9
- data/lib/racc/parser.rb +165 -0
- data/lib/strscan.rb +52 -0
- data/{lib → opal_lib}/opal.rb +2 -0
- data/opal_lib/opal/build_methods.rb +51 -0
- data/opal_lib/opal/builder.rb +164 -0
- data/opal_lib/opal/bundle.rb +70 -0
- data/opal_lib/opal/command.rb +68 -0
- data/{lib → opal_lib}/opal/context.rb +21 -9
- data/{lib → opal_lib}/opal/context/console.rb +0 -2
- data/opal_lib/opal/context/file_system.rb +34 -0
- data/{lib → opal_lib}/opal/context/loader.rb +26 -8
- data/opal_lib/opal/gem.rb +84 -0
- data/{lib → opal_lib}/opal/rake/builder_task.rb +2 -2
- data/opal_lib/opal/rake/spec_task.rb +32 -0
- data/{lib → opal_lib}/opal/ruby/nodes.rb +730 -109
- data/{lib → opal_lib}/opal/ruby/parser.rb +90 -23
- data/opal_lib/opal/ruby/ruby_parser.rb +4862 -0
- data/opal_lib/opal/ruby/ruby_parser.y +1454 -0
- data/opal_lib/opal/version.rb +4 -0
- data/runtime/class.js +359 -0
- data/runtime/debug.js +84 -0
- data/runtime/fs.js +199 -0
- data/runtime/init.js +558 -0
- data/runtime/loader.js +351 -0
- data/runtime/module.js +109 -0
- data/runtime/post.js +10 -0
- data/runtime/pre.js +7 -0
- data/runtime/runtime.js +351 -0
- metadata +88 -175
- data/.gitignore +0 -7
- data/Changelog +0 -31
- data/LICENSE +0 -75
- data/Rakefile +0 -86
- data/gems/core/README.md +0 -14
- data/gems/core/Rakefile +0 -8
- data/gems/core/core.gemspec +0 -13
- data/gems/core/lib/core.rb +0 -34
- data/gems/core/lib/core/class.rb +0 -31
- data/gems/core/lib/core/module.rb +0 -100
- data/gems/core/lib/core/vm.rb +0 -16
- data/gems/core/spec/core/array/append_spec.rb +0 -30
- data/gems/core/spec/core/array/assoc_spec.rb +0 -29
- data/gems/core/spec/core/array/at_spec.rb +0 -37
- data/gems/core/spec/core/array/clear_spec.rb +0 -22
- data/gems/core/spec/core/array/collect_bang_spec.rb +0 -27
- data/gems/core/spec/core/array/collect_spec.rb +0 -27
- data/gems/core/spec/core/array/compact_spec.rb +0 -41
- data/gems/core/spec/core/array/concat_spec.rb +0 -15
- data/gems/core/spec/core/array/constructor_spec.rb +0 -14
- data/gems/core/spec/core/array/each_spec.rb +0 -9
- data/gems/core/spec/core/array/element_reference_spec.rb +0 -4
- data/gems/core/spec/core/array/first_spec.rb +0 -35
- data/gems/core/spec/core/array/include_spec.rb +0 -9
- data/gems/core/spec/core/array/join_spec.rb +0 -6
- data/gems/core/spec/core/array/last_spec.rb +0 -51
- data/gems/core/spec/core/array/length_spec.rb +0 -6
- data/gems/core/spec/core/array/map_spec.rb +0 -33
- data/gems/core/spec/core/array/reverse_spec.rb +0 -6
- data/gems/core/spec/core/builtin_constants/builtin_constants_spec.rb +0 -7
- data/gems/core/spec/core/false/and_spec.rb +0 -10
- data/gems/core/spec/core/false/inspect_spec.rb +0 -6
- data/gems/core/spec/core/false/or_spec.rb +0 -10
- data/gems/core/spec/core/false/to_s_spec.rb +0 -6
- data/gems/core/spec/core/false/xor_spec.rb +0 -10
- data/gems/core/spec/core/file/join_spec.rb +0 -19
- data/gems/core/spec/core/hash/assoc_spec.rb +0 -32
- data/gems/core/spec/core/kernel/instance_eval_spec.rb +0 -0
- data/gems/core/spec/core/kernel/loop_spec.rb +0 -24
- data/gems/core/spec/core/kernel/raise_spec.rb +0 -0
- data/gems/core/spec/core/module/attr_accessor_spec.rb +0 -28
- data/gems/core/spec/core/number/lt_spec.rb +0 -12
- data/gems/core/spec/core/string/sub_spec.rb +0 -24
- data/gems/core/spec/core/true/and_spec.rb +0 -10
- data/gems/core/spec/core/true/inspect_spec.rb +0 -6
- data/gems/core/spec/core/true/or_spec.rb +0 -10
- data/gems/core/spec/core/true/to_s_spec.rb +0 -6
- data/gems/core/spec/core/true/xor_spec.rb +0 -10
- data/gems/core/spec/language/and_spec.rb +0 -61
- data/gems/core/spec/language/array_spec.rb +0 -68
- data/gems/core/spec/language/block_spec.rb +0 -38
- data/gems/core/spec/language/break_spec.rb +0 -36
- data/gems/core/spec/language/case_spec.rb +0 -103
- data/gems/core/spec/language/def_spec.rb +0 -21
- data/gems/core/spec/language/eigenclass_spec.rb +0 -60
- data/gems/core/spec/language/file_spec.rb +0 -13
- data/gems/core/spec/language/fixtures/block.rb +0 -21
- data/gems/core/spec/language/fixtures/super.rb +0 -293
- data/gems/core/spec/language/hash_spec.rb +0 -29
- data/gems/core/spec/language/if_spec.rb +0 -54
- data/gems/core/spec/language/loop_spec.rb +0 -11
- data/gems/core/spec/language/metaclass_spec.rb +0 -21
- data/gems/core/spec/language/method_spec.rb +0 -124
- data/gems/core/spec/language/next_spec.rb +0 -25
- data/gems/core/spec/language/or_spec.rb +0 -34
- data/gems/core/spec/language/redo_spec.rb +0 -24
- data/gems/core/spec/language/regexp_spec.rb +0 -26
- data/gems/core/spec/language/rescue_spec.rb +0 -20
- data/gems/core/spec/language/return_spec.rb +0 -47
- data/gems/core/spec/language/string_spec.rb +0 -25
- data/gems/core/spec/language/super_spec.rb +0 -32
- data/gems/core/spec/language/until_spec.rb +0 -157
- data/gems/core/spec/language/variables_spec.rb +0 -155
- data/gems/core/spec/language/while_spec.rb +0 -163
- data/gems/core/spec/spec_helper.rb +0 -5
- data/gems/core_fs/README.md +0 -19
- data/gems/dev/Rakefile +0 -5
- data/gems/dev/lib/dev.js +0 -99
- data/gems/dev/lib/dev/generator.js +0 -1264
- data/gems/dev/lib/dev/parser.js +0 -979
- data/gems/dev/lib/dev/ruby_parser.js +0 -1088
- data/gems/dev/lib/dev/ruby_parser.y +0 -1267
- data/gems/dev/lib/dev/string_scanner.js +0 -38
- data/gems/dev/tools/racc2js/README.md +0 -39
- data/gems/dev/tools/racc2js/math_parser.js +0 -222
- data/gems/dev/tools/racc2js/math_parser.rb +0 -133
- data/gems/dev/tools/racc2js/math_parser.y +0 -28
- data/gems/dev/tools/racc2js/parser.js +0 -218
- data/gems/dev/tools/racc2js/racc2js.rb +0 -153
- data/gems/json/README.md +0 -4
- data/gems/json/json.gemspec +0 -14
- data/gems/json/lib/json.rb +0 -64
- data/gems/json/lib/json/ext.rb +0 -51
- data/gems/json/lib/json/json2.js +0 -481
- data/gems/ospec/README.md +0 -0
- data/gems/ospec/lib/ospec/autorun.rb +0 -3
- data/gems/ospec/lib/ospec/runner.rb +0 -40
- data/gems/ospec/lib/ospec/runner/formatter/html_formatter.rb +0 -91
- data/gems/ospec/ospec.gemspec +0 -0
- data/gems/rquery/README.md +0 -9
- data/gems/rquery/lib/rquery.rb +0 -10
- data/gems/rquery/lib/rquery/ajax.rb +0 -4
- data/gems/rquery/lib/rquery/css.rb +0 -96
- data/gems/rquery/lib/rquery/document.rb +0 -25
- data/gems/rquery/lib/rquery/element.rb +0 -292
- data/gems/rquery/lib/rquery/event.rb +0 -108
- data/gems/rquery/lib/rquery/jquery.js +0 -8177
- data/gems/rquery/lib/rquery/request.rb +0 -138
- data/gems/rquery/lib/rquery/response.rb +0 -49
- data/gems/rquery/rquery.gemspec +0 -16
- data/lib/opal.js +0 -1597
- data/lib/opal/builder.rb +0 -117
- data/lib/opal/bundle.rb +0 -131
- data/lib/opal/command.rb +0 -11
- data/lib/opal/context/file_system.rb +0 -19
- data/lib/opal/gem.rb +0 -153
- data/lib/opal/ruby/ruby_parser.rb +0 -5170
- data/lib/opal/ruby/ruby_parser.y +0 -1298
- data/opal.gemspec +0 -15
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
|
+
|