1 function pyjs_extend(klass, base) { |
|
2 function klass_object_inherit() {} |
|
3 klass_object_inherit.prototype = base.prototype; |
|
4 klass_object = new klass_object_inherit(); |
|
5 for (var i in base.prototype.__class__) { |
|
6 v = base.prototype.__class__[i]; |
|
7 if (typeof v == "function" && (v.class_method || v.static_method || v.unbound_method)) |
|
8 { |
|
9 klass_object[i] = v; |
|
10 } |
|
11 } |
|
12 |
|
13 function klass_inherit() {} |
|
14 klass_inherit.prototype = klass_object; |
|
15 klass.prototype = new klass_inherit(); |
|
16 klass_object.constructor = klass; |
|
17 klass.prototype.__class__ = klass_object; |
|
18 |
|
19 for (var i in base.prototype) { |
|
20 v = base.prototype[i]; |
|
21 if (typeof v == "function" && v.instance_method) |
|
22 { |
|
23 klass.prototype[i] = v; |
|
24 } |
|
25 } |
|
26 } |
|
27 |
|
28 /* creates a class, derived from bases, with methods and variables */ |
|
29 function pyjs_type(clsname, bases, methods) |
|
30 { |
|
31 var fn_cls = function() {}; |
|
32 fn_cls.__name__ = clsname; |
|
33 var fn = function() { |
|
34 var instance = new fn_cls(); |
|
35 if(instance.__init__) instance.__init__.apply(instance, arguments); |
|
36 return instance; |
|
37 } |
|
38 fn_cls.__initialize__ = function() { |
|
39 if (fn_cls.__was_initialized__) return; |
|
40 fn_cls.__was_initialized__ = true; |
|
41 fn_cls.__extend_baseclasses(); |
|
42 fn_cls.prototype.__class__.__new__ = fn; |
|
43 fn_cls.prototype.__class__.__name__ = clsname; |
|
44 } |
|
45 fn_cls.__extend_baseclasses = function() { |
|
46 var bi; |
|
47 for (bi in fn_cls.__baseclasses) |
|
48 { |
|
49 var b = fn_cls.__baseclasses[bi]; |
|
50 if (b.__was_initialized__) |
|
51 { |
|
52 continue; |
|
53 } |
|
54 b.__initialize__(); |
|
55 } |
|
56 for (bi in fn_cls.__baseclasses) |
|
57 { |
|
58 var b = fn_cls.__baseclasses[bi]; |
|
59 pyjs_extend(fn_cls, b); |
|
60 } |
|
61 } |
|
62 if (!bases) { |
|
63 bases = [pyjslib.__Object]; |
|
64 } |
|
65 fn_cls.__baseclasses = bases; |
|
66 |
|
67 fn_cls.__initialize__(); |
|
68 |
|
69 for (k in methods) { |
|
70 var mth = methods[k]; |
|
71 var mtype = typeof mth; |
|
72 if (mtype == "function" ) { |
|
73 fn_cls.prototype[k] = mth; |
|
74 fn_cls.prototype.__class__[k] = function () { |
|
75 return fn_cls.prototype[k].call.apply( |
|
76 fn_cls.prototype[k], arguments); |
|
77 }; |
|
78 fn_cls.prototype.__class__[k].unbound_method = true; |
|
79 fn_cls.prototype.instance_method = true; |
|
80 fn_cls.prototype.__class__[k].__name__ = k; |
|
81 fn_cls.prototype[k].__name__ = k; |
|
82 } else { |
|
83 fn_cls.prototype.__class__[k] = mth; |
|
84 } |
|
85 } |
|
86 return fn; |
|
87 } |
|
88 function pyjs_kwargs_call(obj, func, star_args, args) |
|
89 { |
|
90 var call_args; |
|
91 |
|
92 if (star_args) |
|
93 { |
|
94 if (!pyjslib.isIteratable(star_args)) |
|
95 { |
|
96 throw (pyjslib.TypeError(func.__name__ + "() arguments after * must be a sequence" + pyjslib.repr(star_args))); |
|
97 } |
|
98 call_args = Array(); |
|
99 var __i = star_args.__iter__(); |
|
100 var i = 0; |
|
101 try { |
|
102 while (true) { |
|
103 call_args[i]=__i.next(); |
|
104 i++; |
|
105 } |
|
106 } catch (e) { |
|
107 if (e != pyjslib.StopIteration) { |
|
108 throw e; |
|
109 } |
|
110 } |
|
111 |
|
112 if (args) |
|
113 { |
|
114 var n = star_args.length; |
|
115 for (var i=0; i < args.length; i++) { |
|
116 call_args[n+i]=args[i]; |
|
117 } |
|
118 } |
|
119 } |
|
120 else |
|
121 { |
|
122 call_args = args; |
|
123 } |
|
124 return func.apply(obj, call_args); |
|
125 } |
|
126 |
|
127 function pyjs_kwargs_function_call(func, star_args, args) |
|
128 { |
|
129 return pyjs_kwargs_call(null, func, star_args, args); |
|
130 } |
|
131 |
|
132 function pyjs_kwargs_method_call(obj, method_name, star_args, args) |
|
133 { |
|
134 var method = obj[method_name]; |
|
135 if (method.parse_kwargs) |
|
136 { |
|
137 args = method.parse_kwargs.apply(null, args); |
|
138 } |
|
139 return pyjs_kwargs_call(obj, method, star_args, args); |
|
140 } |
|
141 |
|
142 //String.prototype.__getitem__ = String.prototype.charAt; |
|
143 //String.prototype.upper = String.prototype.toUpperCase; |
|
144 //String.prototype.lower = String.prototype.toLowerCase; |
|
145 //String.prototype.find=pyjslib.String_find; |
|
146 //String.prototype.join=pyjslib.String_join; |
|
147 //String.prototype.isdigit=pyjslib.String_isdigit; |
|
148 //String.prototype.__iter__=pyjslib.String___iter__; |
|
149 // |
|
150 //String.prototype.__replace=String.prototype.replace; |
|
151 //String.prototype.replace=pyjslib.String_replace; |
|
152 // |
|
153 //String.prototype.split=pyjslib.String_split; |
|
154 //String.prototype.strip=pyjslib.String_strip; |
|
155 //String.prototype.lstrip=pyjslib.String_lstrip; |
|
156 //String.prototype.rstrip=pyjslib.String_rstrip; |
|
157 //String.prototype.startswith=pyjslib.String_startswith; |
|
158 |
|
159 var str = String; |
|
160 |
|