opal 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/docs/jarv.rdoc +27 -0
- data/lib/opal.rb +29 -0
- data/runtime/array.js +153 -0
- data/runtime/class.js +469 -0
- data/runtime/compar.js +73 -0
- data/runtime/dir.js +115 -0
- data/runtime/enum.js +74 -0
- data/runtime/file.js +165 -0
- data/runtime/gem.js +241 -0
- data/runtime/hash.js +181 -0
- data/runtime/init.js +59 -0
- data/runtime/load.js +251 -0
- data/runtime/module.js +98 -0
- data/runtime/number.js +148 -0
- data/runtime/object.js +522 -0
- data/runtime/opal.js +200 -0
- data/runtime/parse.js +2218 -0
- data/runtime/range.js +56 -0
- data/runtime/re.js +91 -0
- data/runtime/string.js +199 -0
- data/runtime/variable.js +184 -0
- data/runtime/vm.js +1150 -0
- data/runtime/yaml.js +33 -0
- data/tasks/build.rb +16 -0
- metadata +90 -0
data/runtime/module.js
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
/*
|
2
|
+
* module.js
|
3
|
+
* opal
|
4
|
+
*
|
5
|
+
* Created by Adam Beynon.
|
6
|
+
* Copyright 2010 Adam Beynon.
|
7
|
+
*
|
8
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
+
* of this software and associated documentation files (the "Software"), to deal
|
10
|
+
* in the Software without restriction, including without limitation the rights
|
11
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
+
* copies of the Software, and to permit persons to whom the Software is
|
13
|
+
* furnished to do so, subject to the following conditions:
|
14
|
+
*
|
15
|
+
* The above copyright notice and this permission notice shall be included in
|
16
|
+
* all copies or substantial portions of the Software.
|
17
|
+
*
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24
|
+
* THE SOFTWARE.
|
25
|
+
*/
|
26
|
+
|
27
|
+
|
28
|
+
var RModule = { } ;
|
29
|
+
|
30
|
+
function rb_define_module(id) {
|
31
|
+
var module;
|
32
|
+
if (rb_const_defined(rb_cObject, id)) {
|
33
|
+
// module = cObject.$c_g(id);
|
34
|
+
module = rb_const_get(rb_cObject, id);
|
35
|
+
if (FL_TEST(module, T_MODULE)) {
|
36
|
+
return module;
|
37
|
+
}
|
38
|
+
throw id + ' is not a module';
|
39
|
+
}
|
40
|
+
module = rb_define_module_id(id);
|
41
|
+
rb_class_tbl[id] = module;
|
42
|
+
rb_const_set(rb_cObject, id, module);
|
43
|
+
|
44
|
+
return module;
|
45
|
+
};
|
46
|
+
|
47
|
+
function rb_define_module_under(outer, id) {
|
48
|
+
var module;
|
49
|
+
if (VN.const_defined_at(outer, id)) {
|
50
|
+
module = VN.const_get_at(outer, id);
|
51
|
+
if (module.type == VN.MODULE) {
|
52
|
+
return module;
|
53
|
+
}
|
54
|
+
VN.type_error(id + ' is not a module');
|
55
|
+
}
|
56
|
+
module = VN.define_module_id(id);
|
57
|
+
VN.const_set(outer, id, module);
|
58
|
+
VN.set_class_path(module, outer, name);
|
59
|
+
return module;
|
60
|
+
};
|
61
|
+
|
62
|
+
function rb_define_module_id(id) {
|
63
|
+
var mdl = rb_mod_create();
|
64
|
+
rb_name_class(mdl, id);
|
65
|
+
// VN.name_class(mdl, id);
|
66
|
+
// mdl.$name(id);
|
67
|
+
// mdl.$name(id);
|
68
|
+
return mdl;
|
69
|
+
};
|
70
|
+
|
71
|
+
function rb_mod_create() {
|
72
|
+
var m = class_alloc(T_MODULE, rb_cModule);
|
73
|
+
m.sup = rb_cObject;
|
74
|
+
return m;
|
75
|
+
}
|
76
|
+
|
77
|
+
// RModule.create = function() {
|
78
|
+
// var mdl = RClass.alloc(VN.MODULE, cModule);
|
79
|
+
// mdl.$super = cObject;
|
80
|
+
// return mdl;
|
81
|
+
// };
|
82
|
+
|
83
|
+
function rb_include_module(klass, module) {
|
84
|
+
// FIXME: need to check if already included, or its a parent etc etc.
|
85
|
+
klass.sup = rb_include_class_new(module, klass);
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
function rb_include_class_new(mod, sup) {
|
90
|
+
var klass = class_alloc(T_ICLASS, rb_cClass);
|
91
|
+
klass.iv_tbl = mod.iv_tbl;
|
92
|
+
klass.m_tbl = mod.m_tbl;
|
93
|
+
klass.sup = sup.sup;
|
94
|
+
klass.klass = mod;
|
95
|
+
// console.log('included class');
|
96
|
+
// console.log(klass);
|
97
|
+
return klass;
|
98
|
+
};
|
data/runtime/number.js
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
/*
|
2
|
+
* number.js
|
3
|
+
* opal
|
4
|
+
*
|
5
|
+
* Created by Adam Beynon.
|
6
|
+
* Copyright 2010 Adam Beynon.
|
7
|
+
*
|
8
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
+
* of this software and associated documentation files (the "Software"), to deal
|
10
|
+
* in the Software without restriction, including without limitation the rights
|
11
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
+
* copies of the Software, and to permit persons to whom the Software is
|
13
|
+
* furnished to do so, subject to the following conditions:
|
14
|
+
*
|
15
|
+
* The above copyright notice and this permission notice shall be included in
|
16
|
+
* all copies or substantial portions of the Software.
|
17
|
+
*
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24
|
+
* THE SOFTWARE.
|
25
|
+
*/
|
26
|
+
|
27
|
+
|
28
|
+
var rb_cNumber;
|
29
|
+
|
30
|
+
function rb_num_plus(a, b) {
|
31
|
+
return a + b;
|
32
|
+
}
|
33
|
+
|
34
|
+
function rb_num_minus(a, b) {
|
35
|
+
return a - b;
|
36
|
+
}
|
37
|
+
|
38
|
+
function rb_num_mul(a, b) {
|
39
|
+
return a * b;
|
40
|
+
}
|
41
|
+
|
42
|
+
function rb_num_div(a, b) {
|
43
|
+
return a / b;
|
44
|
+
}
|
45
|
+
|
46
|
+
function rb_num_modulo(a, b) {
|
47
|
+
return a % b;
|
48
|
+
}
|
49
|
+
|
50
|
+
function rb_num_pow(a, b) {
|
51
|
+
return Math.pow(a, b);
|
52
|
+
}
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
function rb_num_gt(a, b) {
|
60
|
+
return a > b;
|
61
|
+
}
|
62
|
+
|
63
|
+
function rb_num_ge(a, b) {
|
64
|
+
return a >= b;
|
65
|
+
}
|
66
|
+
|
67
|
+
function rb_num_lt(a, b) {
|
68
|
+
return a < b;
|
69
|
+
}
|
70
|
+
|
71
|
+
function rb_num_le(a, b) {
|
72
|
+
return a <= b;
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
function Init_Number() {
|
77
|
+
|
78
|
+
rb_cNumber = rb_define_class("Number", rb_cObject);
|
79
|
+
Number.prototype.klass = rb_cNumber;
|
80
|
+
Number.prototype.flags = T_NUMBER;
|
81
|
+
|
82
|
+
// rb_define_method(rb_cNumber, "singleton_method_added", rb_num_sadded, 1);
|
83
|
+
// rb_include_module(rb_cNumber, rb_mComparable);
|
84
|
+
// rb_define_method(rb_cNumber, "initialize_copy", rb_num_init_copy, 1);
|
85
|
+
// rb_define_method(rb_cNumber, "coerce", rb_num_coerce, 1);
|
86
|
+
|
87
|
+
// rb_define_method(rb_cNumber, "+@", rb_num_uplus, 0);
|
88
|
+
// rb_define_method(rb_cNumber, "-@", rb_num_uminus, 0);
|
89
|
+
// rb_define_method(rb_cNumber, "<=>", rb_num_cmp, 1);
|
90
|
+
// rb_define_method(rb_cNumber, "eql?", rb_num_eql, 1);
|
91
|
+
// rb_define_method(rb_cNumber, "quo", rb_num_quo, 1);
|
92
|
+
// rb_define_method(rb_cNumber, "fdiv", rb_num_fdiv, 1);
|
93
|
+
// rb_define_method(rb_cNumber, "div", rb_num_div, 1);
|
94
|
+
// rb_define_method(rb_cNumber, "divmod", rb_num_divmod, 1);
|
95
|
+
// rb_define_method(rb_cNumber, "modulo", rb_num_modulo, 1);
|
96
|
+
// rb_define_method(rb_cNumber, "remainder", rb_num_remainder, 1);
|
97
|
+
// rb_define_method(rb_cNumber, "abs", rb_num_abs, 0);
|
98
|
+
// rb_define_method(rb_cNumber, "magnitude", rb_num_abs, 0);
|
99
|
+
// rb_define_method(rb_cNumber, "to_int", rb_num_to_i, 0);
|
100
|
+
|
101
|
+
// rb_define_method(rb_cNumber, "real?", rb_num_real_p, 0);
|
102
|
+
// rb_define_method(rb_cNumber, "integer?", rb_num_int_p, 0);
|
103
|
+
// rb_define_method(rb_cNumber, "zero?", rb_num_zero_p, 0);
|
104
|
+
// rb_define_method(rb_cNumber, "nonzero?", rb_num_nonzero_p, 0);
|
105
|
+
|
106
|
+
// rb_define_method(rb_cNumber, "floor", rb_num_floor, 0);
|
107
|
+
// rb_define_method(rb_cNumber, "ceil", rb_num_ceil, 0);
|
108
|
+
// rb_define_method(rb_cNumber, "round", rb_num_round, -1);
|
109
|
+
// rb_define_method(rb_cNumber, "truncate", rb_num_truncate, 0);
|
110
|
+
// rb_define_method(rb_cNumber, "step", rb_num_step, -1);
|
111
|
+
|
112
|
+
// rb_define_method(rb_cNumber, "odd?", rb_num_odd_p, 0);
|
113
|
+
// rb_define_method(rb_cNumber, "even?", rb_num_even_p, 0);
|
114
|
+
// rb_define_method(rb_cNumber, "upto", rb_num_upto, 1);
|
115
|
+
// rb_define_method(rb_cNumber, "downto", rb_num_downto, 1);
|
116
|
+
// rb_define_method(rb_cNumber, "times", rb_num_dotimes, 0);
|
117
|
+
// rb_define_method(rb_cNumber, "succ", rb_num_succ, 0);
|
118
|
+
// rb_define_method(rb_cNumber, "next", rb_num_succ, 0);
|
119
|
+
// rb_define_method(rb_cNumber, "pred", rb_num_pred, 0);
|
120
|
+
// rb_define_method(rb_cNumber, "chr", rb_num_chr, -1);
|
121
|
+
// rb_define_method(rb_cNumber, "ord", rb_num_ord, 0);
|
122
|
+
// rb_define_method(rb_cNumber, "to_i", rb_num_to_i, 0);
|
123
|
+
// rb_define_method(rb_cNumber, "to_s", rb_num_to_s, -1);
|
124
|
+
// rb_define_method(rb_cNumber, "to_f", rb_num_to_f, 0);
|
125
|
+
|
126
|
+
rb_define_method(rb_cNumber, "+", rb_num_plus, 1);
|
127
|
+
rb_define_method(rb_cNumber, "-", rb_num_minus, 1);
|
128
|
+
rb_define_method(rb_cNumber, "*", rb_num_mul, 1);
|
129
|
+
rb_define_method(rb_cNumber, "/", rb_num_div, 1);
|
130
|
+
rb_define_method(rb_cNumber, "%", rb_num_modulo, 1);
|
131
|
+
rb_define_method(rb_cNumber, "**", rb_num_pow, 1);
|
132
|
+
|
133
|
+
// rb_define_method(rb_cNumber, "==", rb_num_equal, 1);
|
134
|
+
// rb_define_method(rb_cNumber, "<=>", rb_num_cmp, 1);
|
135
|
+
rb_define_method(rb_cNumber, ">", rb_num_gt, 1);
|
136
|
+
rb_define_method(rb_cNumber, ">=", rb_num_ge, 1);
|
137
|
+
rb_define_method(rb_cNumber, "<", rb_num_lt, 1);
|
138
|
+
rb_define_method(rb_cNumber, "<=", rb_num_le, 1);
|
139
|
+
|
140
|
+
// rb_define_method(rb_cNumber, "~", rb_num_rev, 0);
|
141
|
+
// rb_define_method(rb_cNumber, "&", rb_num_and, 1);
|
142
|
+
// rb_define_method(rb_cNumber, "|", rb_num_or, 1);
|
143
|
+
// rb_define_method(rb_cNumber, "^", rb_num_xor, 1);
|
144
|
+
// rb_define_method(rb_cNumber, "[]", rb_num_aref, 1);
|
145
|
+
|
146
|
+
// rb_define_method(rb_cNumber, "<<", rb_num_lshift, 1);
|
147
|
+
// rb_define_method(rb_cNumber, ">>", rb_num_rshift, 1);
|
148
|
+
}
|
data/runtime/object.js
ADDED
@@ -0,0 +1,522 @@
|
|
1
|
+
/*
|
2
|
+
* object.js
|
3
|
+
* opal
|
4
|
+
*
|
5
|
+
* Created by Adam Beynon.
|
6
|
+
* Copyright 2010 Adam Beynon.
|
7
|
+
*
|
8
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
+
* of this software and associated documentation files (the "Software"), to deal
|
10
|
+
* in the Software without restriction, including without limitation the rights
|
11
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
+
* copies of the Software, and to permit persons to whom the Software is
|
13
|
+
* furnished to do so, subject to the following conditions:
|
14
|
+
*
|
15
|
+
* The above copyright notice and this permission notice shall be included in
|
16
|
+
* all copies or substantial portions of the Software.
|
17
|
+
*
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24
|
+
* THE SOFTWARE.
|
25
|
+
*/
|
26
|
+
|
27
|
+
|
28
|
+
/**
|
29
|
+
Core objects
|
30
|
+
*/
|
31
|
+
|
32
|
+
var rb_cBasicObject, rb_cObject, rb_cModule, rb_cClass;
|
33
|
+
var rb_cNilClass;
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
// /**
|
38
|
+
// For compatibility
|
39
|
+
// */
|
40
|
+
// RObject.prototype.$i_g = function(id) {
|
41
|
+
// if (this.$iv_tbl[id] == undefined || this.$iv_tbl[id] == null) {
|
42
|
+
// return nil;
|
43
|
+
// }
|
44
|
+
// return this.$iv_tbl[id];
|
45
|
+
// };
|
46
|
+
//
|
47
|
+
// /*
|
48
|
+
// $ - call method
|
49
|
+
// @param id - method name
|
50
|
+
// @param args - array of all arguments
|
51
|
+
// */
|
52
|
+
// RObject.prototype.$ = function(id, args) {
|
53
|
+
// var method = this.$klass.$search_method(id);
|
54
|
+
//
|
55
|
+
// if (!method) {
|
56
|
+
// console.log(this);
|
57
|
+
// throw 'RObject#call cannot find method: ' + id ;
|
58
|
+
// }
|
59
|
+
// return method.apply(this, args) ;
|
60
|
+
// };
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
/**
|
69
|
+
Call super method
|
70
|
+
*/
|
71
|
+
var rb_supcall = function rb_supcall(from, self, id, args) {
|
72
|
+
var method = self.$klass.$search_super_method(from, id);
|
73
|
+
if (!method) throw 'RObject#call cannot find super method for: ' + id ;
|
74
|
+
|
75
|
+
switch(args.length) {
|
76
|
+
case 0: return method(self, id);
|
77
|
+
case 1: return method(self, id, args[0]);
|
78
|
+
case 2: return method(self, id, args[0], args[1]);
|
79
|
+
case 3: return method(self, id, args[0], args[1], args[2]);
|
80
|
+
case 4: return method(self, id, args[0], args[1], args[2], args[3]);
|
81
|
+
}
|
82
|
+
|
83
|
+
return method.apply(self, arguments);
|
84
|
+
};
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
// RClass.prototype.$search_super_method = function(from,id) {
|
89
|
+
// // get current
|
90
|
+
//
|
91
|
+
// /**
|
92
|
+
// Match func = from, to match current function
|
93
|
+
// THEN search by name from there up, otherwise, chains of more then
|
94
|
+
// 2 supers will keep rematching second super
|
95
|
+
// */
|
96
|
+
// var klass = this; var func;
|
97
|
+
// while (!((func = klass.$m_tbl[id]) && func == from)) {
|
98
|
+
// klass = klass.$super;
|
99
|
+
// if (!klass) return undefined;
|
100
|
+
// }
|
101
|
+
// // now skip up one
|
102
|
+
// klass = klass.$super;
|
103
|
+
// if (!klass) return undefined;
|
104
|
+
// while (!(func = klass.$m_tbl[id])) {
|
105
|
+
// klass = klass.$super;
|
106
|
+
// if(!klass) return undefined;
|
107
|
+
// }
|
108
|
+
// return func;
|
109
|
+
//
|
110
|
+
// //
|
111
|
+
// // var klass = this; var func;
|
112
|
+
// // while (!((func = klass.$m_tbl[id]) && func != from)) {
|
113
|
+
// // klass = klass.$super;
|
114
|
+
// // if(!klass) return undefined;
|
115
|
+
// // }
|
116
|
+
// //
|
117
|
+
// // var klass = this; var func;
|
118
|
+
// // // console.log('from');
|
119
|
+
// // // console.log(from);
|
120
|
+
// // // console.log('views');
|
121
|
+
// // // console.log(klass.$m_tbl[id]);
|
122
|
+
// // // console.log(klass.$m_tbl[id] === from);
|
123
|
+
// // // console.log(klass.$m_tbl[id]);
|
124
|
+
// // while (!((func = klass.$m_tbl[id]) && func != from)) {
|
125
|
+
// // klass = klass.$super;
|
126
|
+
// // if(!klass) return undefined;
|
127
|
+
// // }
|
128
|
+
// // // return func = klass.$m_tbl[id];
|
129
|
+
// // // return func = klass.$m_tbl[id];
|
130
|
+
// // return func;
|
131
|
+
//
|
132
|
+
// // var klass = this; var func ;
|
133
|
+
// //
|
134
|
+
// // while (!(func = klass.$m_tbl[id])) {
|
135
|
+
// // klass = klass.$super;
|
136
|
+
// // if (!klass) return undefined;
|
137
|
+
// // }
|
138
|
+
// // console.log('this point');
|
139
|
+
// // // we have the current impl, now we need to search for the super from this point..
|
140
|
+
// // klass = klass.$super;
|
141
|
+
// // if (!klass) return undefined;
|
142
|
+
// // while (!(func = klass.$m_tbl[id])) {
|
143
|
+
// // klass = klass.$super;
|
144
|
+
// // if (!klass) return undefined;
|
145
|
+
// // }
|
146
|
+
// // return func;
|
147
|
+
// };
|
148
|
+
|
149
|
+
// /**
|
150
|
+
// For compatibility
|
151
|
+
// */
|
152
|
+
// var VN$sup = rb_supcall;
|
153
|
+
//
|
154
|
+
// /**
|
155
|
+
// Call super
|
156
|
+
// - from = callee
|
157
|
+
// */
|
158
|
+
// RObject.prototype.$sup = function(from, id, args) {
|
159
|
+
// // console.log('callee');
|
160
|
+
// // console.log(from);
|
161
|
+
// var method = this.$klass.$search_super_method(from, id);
|
162
|
+
// if (!method) throw 'RObject#call cannot find super method for: ' + id ;
|
163
|
+
// // console.log('got super');
|
164
|
+
// // console.log(method);
|
165
|
+
// return method.apply(this, args) ;
|
166
|
+
// };
|
167
|
+
//
|
168
|
+
// /**
|
169
|
+
// We need to copy some of RClass' methods for singletons
|
170
|
+
// */
|
171
|
+
// RObject.prototype.$def_s = RClass.prototype.$def_s;
|
172
|
+
// RObject.prototype.$make_metaclass = RClass.prototype.$make_metaclass;
|
173
|
+
|
174
|
+
|
175
|
+
/*
|
176
|
+
* object.js
|
177
|
+
* vienna
|
178
|
+
*
|
179
|
+
* Created by Adam Beynon.
|
180
|
+
* Copyright 2009 Adam Beynon.
|
181
|
+
*
|
182
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
183
|
+
* of this software and associated documentation files (the "Software"), to deal
|
184
|
+
* in the Software without restriction, including without limitation the rights
|
185
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
186
|
+
* copies of the Software, and to permit persons to whom the Software is
|
187
|
+
* furnished to do so, subject to the following conditions:
|
188
|
+
*
|
189
|
+
* The above copyright notice and this permission notice shall be included in
|
190
|
+
* all copies or substantial portions of the Software.
|
191
|
+
*
|
192
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
193
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
194
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
195
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
196
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
197
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
198
|
+
* THE SOFTWARE.
|
199
|
+
*/
|
200
|
+
|
201
|
+
function rb_obj_alloc(klass) {
|
202
|
+
return rb_class_allocate_instance(klass);
|
203
|
+
// return rb_funcall(klass, 'allocate', 0);
|
204
|
+
}
|
205
|
+
|
206
|
+
function rb_obj_dummy() {
|
207
|
+
return nil;
|
208
|
+
}
|
209
|
+
|
210
|
+
function rb_class_allocate_instance(klass) {
|
211
|
+
var o = new RObject();
|
212
|
+
o.klass = klass;
|
213
|
+
FL_SET(o, T_OBJECT);
|
214
|
+
return o;
|
215
|
+
}
|
216
|
+
|
217
|
+
function rb_obj_equal(self, obj) {
|
218
|
+
if (self == obj) return true;
|
219
|
+
return false;
|
220
|
+
}
|
221
|
+
|
222
|
+
function rb_obj_not(self) {
|
223
|
+
return RTEST(self) ? false : true;
|
224
|
+
}
|
225
|
+
|
226
|
+
function rb_obj_not_equal(self, obj) {
|
227
|
+
var r = rb_funcall(self, "==", obj);
|
228
|
+
return RTEST(r) ? false : true;
|
229
|
+
}
|
230
|
+
|
231
|
+
function rb_false() {
|
232
|
+
return false;
|
233
|
+
}
|
234
|
+
|
235
|
+
function rb_true() {
|
236
|
+
return true;
|
237
|
+
}
|
238
|
+
|
239
|
+
function rb_equal(self, obj) {
|
240
|
+
var r;
|
241
|
+
if (self == obj) return true;
|
242
|
+
r = rb_funcall(self, "==", obj);
|
243
|
+
if (RTEST(r)) return true;
|
244
|
+
return false;
|
245
|
+
}
|
246
|
+
|
247
|
+
function rb_obj_match() {
|
248
|
+
return nil;
|
249
|
+
}
|
250
|
+
|
251
|
+
function rb_obj_not_match(self, obj) {
|
252
|
+
var r = rb_funcall(self, "=~", obj);
|
253
|
+
return RTEST(r) ? false : true;
|
254
|
+
}
|
255
|
+
|
256
|
+
function rb_class_real(klass) {
|
257
|
+
if (!klass) return nil;
|
258
|
+
while (FL_TEST(klass, FL_SINGLETON) || FL_TEST(klass, T_ICLASS)) {
|
259
|
+
klass = klass.sup;
|
260
|
+
}
|
261
|
+
return klass;
|
262
|
+
}
|
263
|
+
|
264
|
+
function rb_obj_class(self) {
|
265
|
+
return rb_class_real(self.klass);
|
266
|
+
}
|
267
|
+
|
268
|
+
function rb_obj_clone(self) {
|
269
|
+
return self;
|
270
|
+
}
|
271
|
+
|
272
|
+
function rb_obj_dup(self) {
|
273
|
+
return self;
|
274
|
+
}
|
275
|
+
|
276
|
+
function rb_obj_init_copy(self) {
|
277
|
+
return self;
|
278
|
+
}
|
279
|
+
|
280
|
+
function rb_any_to_s(self) {
|
281
|
+
var c = rb_obj_classname(self);
|
282
|
+
return "<" + c + ":0x000000>";
|
283
|
+
}
|
284
|
+
|
285
|
+
function rb_obj_inspect(self) {
|
286
|
+
return rb_any_to_s(self);
|
287
|
+
}
|
288
|
+
|
289
|
+
function rb_class_new_instance(argc, argv, klass) {
|
290
|
+
var o = rb_obj_alloc(klass);
|
291
|
+
// initialize..
|
292
|
+
var call_args = [o, "initialize", argc];
|
293
|
+
for (var i = 0; i < argc; i++) {
|
294
|
+
call_args.push(argv[i]);
|
295
|
+
}
|
296
|
+
rb_funcall.apply(o, call_args);
|
297
|
+
|
298
|
+
return o;
|
299
|
+
};
|
300
|
+
|
301
|
+
function rb_f_puts(argc, argv, recv) {
|
302
|
+
for (var i = 0; i < argc; i++) {
|
303
|
+
console.log(argv[i]);
|
304
|
+
}
|
305
|
+
};
|
306
|
+
|
307
|
+
function rb_mod_attr_reader(argc, argv, recv) {
|
308
|
+
for (var i = 0; i < argc; i++) {
|
309
|
+
var s = argv[i].ptr;
|
310
|
+
var f = new Function('r', 'return rb_ivar_get(r, "@' + s + '");');
|
311
|
+
rb_define_method(recv, s, f, 0);
|
312
|
+
}
|
313
|
+
return nil;
|
314
|
+
};
|
315
|
+
|
316
|
+
function rb_mod_attr_writer(argc, argv, recv) {
|
317
|
+
for (var i = 0; i < argc; i++) {
|
318
|
+
var s = argv[i].ptr;
|
319
|
+
var f = new Function('r', 'v', 'return rb_ivar_set(r, "@' + s + '", v);');
|
320
|
+
rb_define_method(recv, s + '=', f, 1);
|
321
|
+
}
|
322
|
+
return nil;
|
323
|
+
};
|
324
|
+
|
325
|
+
function rb_mod_attr_accessor(argc, argv, recv) {
|
326
|
+
rb_mod_attr_reader(argc, argv, recv);
|
327
|
+
rb_mod_attr_writer(argc, argv, recv);
|
328
|
+
return nil;
|
329
|
+
};
|
330
|
+
|
331
|
+
function rb_mod_const_set(mod, id, val) {
|
332
|
+
// FIXME: should really check that id is valid... i.e. does it start with an
|
333
|
+
// uppercase letter.
|
334
|
+
rb_const_set(mod, id, val);
|
335
|
+
return val;
|
336
|
+
};
|
337
|
+
|
338
|
+
function rb_obj_respond_to(argc, argv, obj) {
|
339
|
+
// first arg is a symbol to use
|
340
|
+
var id = argv[0].ptr;
|
341
|
+
var f = rb_search_method(obj.klass, id);
|
342
|
+
if (f) return true;
|
343
|
+
return false;
|
344
|
+
};
|
345
|
+
|
346
|
+
|
347
|
+
|
348
|
+
|
349
|
+
|
350
|
+
function Init_Object() {
|
351
|
+
var metaclass;
|
352
|
+
rb_cBasicObject = boot_defclass('BasicObject', null);
|
353
|
+
rb_cObject = boot_defclass('Object', rb_cBasicObject);
|
354
|
+
rb_cModule = boot_defclass('Module', rb_cObject);
|
355
|
+
rb_cClass = boot_defclass('Class', rb_cModule);
|
356
|
+
|
357
|
+
// hmm, we jhave to set the const again... or should we?
|
358
|
+
rb_const_set(rb_cObject, "BaiscObject", rb_cBasicObject);
|
359
|
+
|
360
|
+
metaclass = rb_make_metaclass(rb_cBasicObject, rb_cClass);
|
361
|
+
metaclass = rb_make_metaclass(rb_cObject, metaclass);
|
362
|
+
metaclass = rb_make_metaclass(rb_cModule, metaclass);
|
363
|
+
metaclass = rb_make_metaclass(rb_cClass, metaclass);
|
364
|
+
|
365
|
+
boot_defmetametaclass(rb_cModule, metaclass);
|
366
|
+
boot_defmetametaclass(rb_cObject, metaclass);
|
367
|
+
boot_defmetametaclass(rb_cBasicObject, metaclass);
|
368
|
+
|
369
|
+
rb_define_private_method(rb_cBasicObject, "initialize", rb_obj_dummy, 0);
|
370
|
+
// FIXME: wtf made this break?
|
371
|
+
// rb_define_alloc_func(rb_cBasicObject, rb_class_allocate_instance);
|
372
|
+
rb_define_method(rb_cBasicObject, "==", rb_obj_equal, 1);
|
373
|
+
rb_define_method(rb_cBasicObject, "equal?", rb_obj_equal, 1);
|
374
|
+
rb_define_method(rb_cBasicObject, "!", rb_obj_not, 0);
|
375
|
+
rb_define_method(rb_cBasicObject, "!=", rb_obj_not_equal, 1);
|
376
|
+
|
377
|
+
rb_define_private_method(rb_cBasicObject, "singleton_method_added", rb_obj_dummy, 1);
|
378
|
+
rb_define_private_method(rb_cBasicObject, "singleton_method_removed", rb_obj_dummy, 1);
|
379
|
+
rb_define_private_method(rb_cBasicObject, "singleton_method_undefined", rb_obj_dummy, 1);
|
380
|
+
|
381
|
+
rb_mKernel = rb_define_module("Kernel");
|
382
|
+
rb_include_module(rb_cObject, rb_mKernel);
|
383
|
+
rb_define_private_method(rb_cClass, "inherited", rb_obj_dummy, 1);
|
384
|
+
rb_define_private_method(rb_cModule, "included", rb_obj_dummy, 1);
|
385
|
+
rb_define_private_method(rb_cModule, "extended", rb_obj_dummy, 1);
|
386
|
+
rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy, 1);
|
387
|
+
rb_define_private_method(rb_cModule, "method_removed", rb_obj_dummy, 1);
|
388
|
+
rb_define_private_method(rb_cModule, "method_undefined", rb_obj_dummy, 1);
|
389
|
+
|
390
|
+
rb_define_method(rb_mKernel, "nil?", rb_false, 0);
|
391
|
+
rb_define_method(rb_mKernel, "===", rb_equal, 1);
|
392
|
+
rb_define_method(rb_mKernel, "=~", rb_obj_match, 1);
|
393
|
+
rb_define_method(rb_mKernel, "!~", rb_obj_not_match, 1);
|
394
|
+
rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1);
|
395
|
+
|
396
|
+
rb_define_method(rb_mKernel, "class", rb_obj_class, 0);
|
397
|
+
rb_define_method(rb_mKernel, "clone", rb_obj_clone, 0);
|
398
|
+
rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0);
|
399
|
+
rb_define_method(rb_mKernel, "initialize_copy", rb_obj_init_copy, 1);
|
400
|
+
|
401
|
+
// rb_define_method(rb_mKernel, "taint", rb_obj_taint, 0);
|
402
|
+
// rb_define_method(rb_mKernel, "tainted?", rb_obj_tainted, 0);
|
403
|
+
// rb_define_method(rb_mKernel, "untaint", rb_obj_untaint, 0);
|
404
|
+
// rb_define_method(rb_mKernel, "untrust", rb_obj_untrust, 0);
|
405
|
+
// rb_define_method(rb_mKernel, "untrusted?", rb_obj_untrusted, 0);
|
406
|
+
// rb_define_method(rb_mKernel, "trust", rb_obj_trust, 0);
|
407
|
+
// rb_define_method(rb_mKernel, "freeze", rb_obj_freeze, 0);
|
408
|
+
// rb_define_method(rb_mKernel, "frozen?", rb_obj_frozen_p, 0);
|
409
|
+
|
410
|
+
rb_define_method(rb_mKernel, "respond_to?", rb_obj_respond_to, -1);
|
411
|
+
|
412
|
+
rb_define_method(rb_mKernel, "puts", rb_f_puts, -1);
|
413
|
+
|
414
|
+
rb_define_method(rb_mKernel, "to_s", rb_any_to_s, 0);
|
415
|
+
rb_define_method(rb_mKernel, "inspect", rb_obj_inspect, 0);
|
416
|
+
// rb_define_method(rb_mKernel, "methods", rb_obj_methods, -1);
|
417
|
+
// rb_define_method(rb_mKernel, "singleton_methods", rb_obj_singleton_methods, -1);
|
418
|
+
// rb_define_method(rb_mKernel, "protected_methods", rb_obj_protected_methods, -1);
|
419
|
+
// rb_define_method(rb_mKernel, "private_methods", rb_obj_private_methods, -1);
|
420
|
+
// rb_define_method(rb_mKernel, "public_methods", rb_obj_public_methods, -1);
|
421
|
+
// rb_define_method(rb_mKernel, "instance_variables", rb_obj_instance_variables, 0);
|
422
|
+
// rb_define_method(rb_mKernel, "instance_variable_get", rb_obj_ivar_get, 1);
|
423
|
+
// rb_define_method(rb_mKernel, "instance_variable_set", rb_obj_ivar_set, 2);
|
424
|
+
// rb_define_method(rb_mKernel, "instance_variable_defined?", rb_obj_ivar_defined, 1);
|
425
|
+
// rb_define_private_method(rb_mKernel, "remove_instance_variable", rb_obj_remove_instance_variable, 1);
|
426
|
+
//
|
427
|
+
// rb_define_method(rb_mKernel, "instance_of?", rb_obj_is_instance_of, 1);
|
428
|
+
// rb_define_method(rb_mKernel, "kind_of?", rb_obj_is_kind_of, 1);
|
429
|
+
// rb_define_method(rb_mKernel, "is_a?", rb_obj_is_kind_of, 1);
|
430
|
+
// rb_define_method(rb_mKernel, "tap", rb_obj_tap, 0);
|
431
|
+
//
|
432
|
+
// rb_define_global_function("sprintf", rb_f_sprintf, -1);
|
433
|
+
// rb_define_global_function("format", rb_f_sprintf, -1);
|
434
|
+
//
|
435
|
+
// rb_define_global_function("Integer", rb_f_integer, 1);
|
436
|
+
// rb_define_global_function("Float", rb_f_float, 1);
|
437
|
+
//
|
438
|
+
// rb_define_global_function("String", rb_f_string, 1);
|
439
|
+
// rb_define_global_function("Array", rb_f_array, 1);
|
440
|
+
|
441
|
+
rb_cNilClass = rb_define_class("NilClass", rb_cObject);
|
442
|
+
// rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
|
443
|
+
// rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
|
444
|
+
// rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0);
|
445
|
+
// rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0);
|
446
|
+
// rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0);
|
447
|
+
// rb_define_method(rb_cNilClass, "&", false_and, 1);
|
448
|
+
// rb_define_method(rb_cNilClass, "|", false_or, 1);
|
449
|
+
// rb_define_method(rb_cNilClass, "^", false_xor, 1);
|
450
|
+
nil = { flags: T_OBJECT, klass: rb_cNilClass };
|
451
|
+
//
|
452
|
+
// rb_define_method(rb_cNilClass, "nil?", rb_true, 0);
|
453
|
+
// rb_undef_alloc_func(rb_cNilClass);
|
454
|
+
// rb_undef_method(rb_cNilClass.klass, "new");
|
455
|
+
// rb_define_global_const("NIL", Qnil);
|
456
|
+
//
|
457
|
+
// rb_define_method(rb_cModule, "freeze", rb_mod_freeze, 0);
|
458
|
+
// rb_define_method(rb_cModule, "===", rb_mod_eqq, 1);
|
459
|
+
// rb_define_method(rb_cModule, "==", rb_obj_equal, 1);
|
460
|
+
// rb_define_method(rb_cModule, "<=>", rb_mod_cmp, 1);
|
461
|
+
// rb_define_method(rb_cModule, "<", rb_mod_lt, 1);
|
462
|
+
// rb_define_method(rb_cModule, "<=", rb_class_inherited_p, 1);
|
463
|
+
// rb_define_method(rb_cModule, ">", rb_mod_gt, 1);
|
464
|
+
// rb_define_method(rb_cModule, ">=", rb_mod_ge, 1);
|
465
|
+
// rb_define_method(rb_cModule, "initialize_copy", rb_mod_init_copy, 1);
|
466
|
+
// rb_define_method(rb_cModule, "to_s", rb_mod_to_s, 0);
|
467
|
+
// rb_define_method(rb_cModule, "included_modules", rb_mod_included_modules, 0);
|
468
|
+
// rb_define_method(rb_cModule, "include?", rb_mod_include_p, 1);
|
469
|
+
// rb_define_method(rb_cModule, "name", rb_mod_name, 0);
|
470
|
+
// rb_define_method(rb_cModule, "ancestors", rb_mod_ancestors, 0);
|
471
|
+
//
|
472
|
+
// rb_define_private_method(rb_cModule, "attr", rb_mod_attr, -1);
|
473
|
+
rb_define_private_method(rb_cModule, "attr_reader", rb_mod_attr_reader, -1);
|
474
|
+
rb_define_private_method(rb_cModule, "attr_writer", rb_mod_attr_writer, -1);
|
475
|
+
rb_define_private_method(rb_cModule, "attr_accessor", rb_mod_attr_accessor, -1);
|
476
|
+
//
|
477
|
+
// rb_define_alloc_func(rb_cModule, rb_module_s_alloc);
|
478
|
+
// rb_define_method(rb_cModule, "initialize", rb_mod_initialize, 0);
|
479
|
+
// rb_define_method(rb_cModule, "instance_methods", rb_class_instance_methods, -1);
|
480
|
+
// rb_define_method(rb_cModule, "public_instance_methods", rb_class_public_instance_methods, -1);
|
481
|
+
// rb_define_method(rb_cModule, "protected_instance_methods", rb_class_protected_instance_methods, -1);
|
482
|
+
// rb_define_method(rb_cModule, "private_instance_methods", rb_class_private_instance_methods, -1);
|
483
|
+
//
|
484
|
+
// rb_define_method(rb_cModule, "constants", rb_mod_constants, -1);
|
485
|
+
// rb_define_method(rb_cModule, "const_get", rb_mod_const_get, -1);
|
486
|
+
rb_define_method(rb_cModule, "const_set", rb_mod_const_set, 2);
|
487
|
+
// rb_define_method(rb_cModule, "const_defined?", rb_mod_const_defined, -1);
|
488
|
+
// rb_define_private_method(rb_cModule, "remove_const", rb_mod_remove_const, 1);
|
489
|
+
// rb_define_method(rb_cModule, "const_missing", rb_mod_const_missing, 1);
|
490
|
+
// rb_define_method(rb_cModule, "class_variables", rb_mod_class_variables, 0);
|
491
|
+
// rb_define_method(rb_cModule, "remove_class_variable", rb_mod_remove_cvar, 1);
|
492
|
+
// rb_define_method(rb_cModule, "class_variable_get", rb_mod_cvar_get, 1);
|
493
|
+
// rb_define_method(rb_cModule, "class_variable_set", rb_mod_cvar_set, 2);
|
494
|
+
// rb_define_method(rb_cModule, "class_variable_defined?", rb_mod_cvar_defined, 1);
|
495
|
+
//
|
496
|
+
rb_define_method(rb_cClass, "allocate", rb_obj_alloc, 0);
|
497
|
+
rb_define_method(rb_cClass, "new", rb_class_new_instance, -1);
|
498
|
+
// rb_define_method(rb_cClass, "initialize", rb_class_initialize, -1);
|
499
|
+
// rb_define_method(rb_cClass, "initialize_copy", rb_class_init_copy, 1);
|
500
|
+
// rb_define_method(rb_cClass, "superclass", rb_class_superclass, 0);
|
501
|
+
// rb_define_alloc_func(rb_cClass, rb_class_s_alloc);
|
502
|
+
// rb_undef_method(rb_cClass, "extend_object");
|
503
|
+
// rb_undef_method(rb_cClass, "append_features");
|
504
|
+
//
|
505
|
+
// rb_cTrueClass = rb_define_class("TrueClass", rb_cObject);
|
506
|
+
// rb_define_method(rb_cTrueClass, "to_s", true_to_s, 0);
|
507
|
+
// rb_define_method(rb_cTrueClass, "&", true_and, 1);
|
508
|
+
// rb_define_method(rb_cTrueClass, "|", true_or, 1);
|
509
|
+
// rb_define_method(rb_cTrueClass, "^", true_xor, 1);
|
510
|
+
// rb_undef_alloc_func(rb_cTrueClass);
|
511
|
+
// rb_undef_method(rb_cTrueClass.klass, "new");
|
512
|
+
// rb_define_global_const("TRUE", true);
|
513
|
+
//
|
514
|
+
// rb_cFalseClass = rb_define_class("FalseClass", rb_cObject);
|
515
|
+
// rb_define_method(rb_cFalseClass, "to_s", false_to_s, 0);
|
516
|
+
// rb_define_method(rb_cFalseClass, "&", false_and, 1);
|
517
|
+
// rb_define_method(rb_cFalseClass, "|", false_or, 1);
|
518
|
+
// rb_define_method(rb_cFalseClass, "^", false_xor, 1);
|
519
|
+
// rb_undef_alloc_func(rb_cFalseClass);
|
520
|
+
// rb_undef_method(rb_cFalseClass.klass, "new");
|
521
|
+
// rb_define_global_const("FALSE", false);
|
522
|
+
}
|