|
@@ -164,29 +164,56 @@ function Smalltalk(){
|
|
|
/* Initialize a class in its class hierarchy. Handle both class and
|
|
|
metaclasses. */
|
|
|
|
|
|
- st.init = function(klass) {
|
|
|
- var subclasses = st.subclasses(klass);
|
|
|
- var methods;
|
|
|
-
|
|
|
- if(klass.superclass && klass.superclass !== nil) {
|
|
|
- methods = st.methods(klass.superclass);
|
|
|
-
|
|
|
- //Methods linking
|
|
|
- for(var i in methods) {
|
|
|
- if(!klass.fn.prototype.methods[i]) {
|
|
|
- klass.fn.prototype.inheritedMethods[i] = methods[i];
|
|
|
- klass.fn.prototype[methods[i].jsSelector] = methods[i].fn;
|
|
|
+ if ('function' === typeof Object.keys) {
|
|
|
+ st.init = function(klass) {
|
|
|
+ var subclasses = st.subclasses(klass);
|
|
|
+ var methods, proto = klass.fn.prototype;
|
|
|
+
|
|
|
+ if(klass.superclass && klass.superclass !== nil) {
|
|
|
+ methods = st.methods(klass.superclass);
|
|
|
+
|
|
|
+ //Methods linking
|
|
|
+ for(var keys=Object.keys(methods),i=0,l=keys.length; i<l; ++i) {
|
|
|
+ var k = keys[i]
|
|
|
+ if(!proto.methods[k]) {
|
|
|
+ proto.inheritedMethods[k] = methods[k];
|
|
|
+ proto[methods[k].jsSelector] = methods[k].fn;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- for(var i=0;i<subclasses.length;i++) {
|
|
|
- st.init(subclasses[i]);
|
|
|
- }
|
|
|
- if(klass.klass && !klass.meta) {
|
|
|
- st.init(klass.klass);
|
|
|
- }
|
|
|
- };
|
|
|
+ for(var i=0;i<subclasses.length;i++) {
|
|
|
+ st.init(subclasses[i]);
|
|
|
+ }
|
|
|
+ if(klass.klass && !klass.meta) {
|
|
|
+ st.init(klass.klass);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ st.init = function(klass) {
|
|
|
+ var subclasses = st.subclasses(klass);
|
|
|
+ var methods, proto = klass.fn.prototype;
|
|
|
+
|
|
|
+ if(klass.superclass && klass.superclass !== nil) {
|
|
|
+ methods = st.methods(klass.superclass);
|
|
|
+
|
|
|
+ //Methods linking
|
|
|
+ for(var i in methods) {
|
|
|
+ if(!proto.methods[i]) {
|
|
|
+ proto.inheritedMethods[i] = methods[i];
|
|
|
+ proto[methods[i].jsSelector] = methods[i].fn;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for(var i=0;i<subclasses.length;i++) {
|
|
|
+ st.init(subclasses[i]);
|
|
|
+ }
|
|
|
+ if(klass.klass && !klass.meta) {
|
|
|
+ st.init(klass.klass);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
|
|
|
/* Answer all registered Packages as Array */
|
|
|
|
|
@@ -201,27 +228,55 @@ function Smalltalk(){
|
|
|
|
|
|
/* Answer all registered Smalltalk classes */
|
|
|
|
|
|
- st.classes = function() {
|
|
|
- var classes = [];
|
|
|
- for(var i in st) {
|
|
|
- if(i.search(/^[A-Z]/g) != -1) {
|
|
|
- classes.push(st[i]);
|
|
|
+ if ('function' === typeof Object.keys) {
|
|
|
+ st.classes = function() {
|
|
|
+ var classes = [], names = Object.keys(st), l = names.length;
|
|
|
+ for (var i=0; i<l; ++i) {
|
|
|
+ var name = names[i];
|
|
|
+ if (name.search(/^[A-Z]/) !== -1) {
|
|
|
+ classes.push(st[name]);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- return classes
|
|
|
- };
|
|
|
+ return classes;
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ st.classes = function() {
|
|
|
+ var classes = [];
|
|
|
+ for(var i in st) {
|
|
|
+ if(i.search(/^[A-Z]/g) != -1) {
|
|
|
+ classes.push(st[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return classes
|
|
|
+ };
|
|
|
+ }
|
|
|
|
|
|
/* Answer all methods (included inherited ones) of klass. */
|
|
|
|
|
|
- st.methods = function(klass) {
|
|
|
- var methods = {};
|
|
|
- for(var i in klass.fn.prototype.methods) {
|
|
|
- methods[i] = klass.fn.prototype.methods[i]
|
|
|
- }
|
|
|
- for(var i in klass.fn.prototype.inheritedMethods) {
|
|
|
- methods[i] = klass.fn.prototype.inheritedMethods[i]
|
|
|
- }
|
|
|
- return methods;
|
|
|
+ if ('function' === typeof Object.keys) {
|
|
|
+ st.methods = function(klass) {
|
|
|
+ var methods = {};
|
|
|
+ var copyFrom = klass.fn.prototype.methods;
|
|
|
+ for(var i=0, k=Object.keys(copyFrom), l=k.length; i<l; ++i) {
|
|
|
+ methods[k[i]] = copyFrom[k[i]];
|
|
|
+ }
|
|
|
+ copyFrom = klass.fn.prototype.inheritedMethods;
|
|
|
+ for(var i=0, k=Object.keys(copyFrom), l=k.length; i<l; ++i) {
|
|
|
+ methods[k[i]] = copyFrom[k[i]];
|
|
|
+ }
|
|
|
+ return methods;
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ st.methods = function(klass) {
|
|
|
+ var methods = {};
|
|
|
+ for(var i in klass.fn.prototype.methods) {
|
|
|
+ methods[i] = klass.fn.prototype.methods[i]
|
|
|
+ }
|
|
|
+ for(var i in klass.fn.prototype.inheritedMethods) {
|
|
|
+ methods[i] = klass.fn.prototype.inheritedMethods[i]
|
|
|
+ }
|
|
|
+ return methods;
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
/* Answer the direct subclasses of klass. */
|
|
@@ -229,15 +284,17 @@ function Smalltalk(){
|
|
|
st.subclasses = function(klass) {
|
|
|
var subclasses = [];
|
|
|
var classes = st.classes();
|
|
|
- for(var i in classes) {
|
|
|
- if(classes[i].fn) {
|
|
|
- //Metaclasses
|
|
|
- if(classes[i].klass && classes[i].klass.superclass === klass) {
|
|
|
- subclasses.push(classes[i].klass);
|
|
|
- }
|
|
|
+ for(var i=0, l=classes.length; i<l; ++i) {
|
|
|
+ var c = classes[i]
|
|
|
+ if(c.fn) {
|
|
|
//Classes
|
|
|
- if(classes[i].superclass === klass) {
|
|
|
- subclasses.push(classes[i]);
|
|
|
+ if(c.superclass === klass) {
|
|
|
+ subclasses.push(c);
|
|
|
+ }
|
|
|
+ c = c.klass;
|
|
|
+ //Metaclasses
|
|
|
+ if(c && c.superclass === klass) {
|
|
|
+ subclasses.push(c);
|
|
|
}
|
|
|
}
|
|
|
}
|