1
0
Переглянути джерело

Merge remote-tracking branch 'origin/master'

Göran Krampe 13 роки тому
батько
коміт
3dc1e9886e

+ 74 - 63
js/Kernel-Classes.deploy.js

@@ -4,7 +4,7 @@ smalltalk.addMethod(
 unescape('_addCompiledMethod_'),
 smalltalk.method({
 selector: unescape('addCompiledMethod%3A'),
-fn: function (aMethod){
+fn: function (aMethod) {
 var self=this;
 smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
 return self;}
@@ -15,7 +15,7 @@ smalltalk.addMethod(
 unescape('_allInstanceVariableNames'),
 smalltalk.method({
 selector: unescape('allInstanceVariableNames'),
-fn: function (){
+fn: function () {
 var self=this;
 var result=nil;
 (result=smalltalk.send(smalltalk.send(self, "_instanceVariableNames", []), "_copy", []));
@@ -29,7 +29,7 @@ smalltalk.addMethod(
 unescape('_allSubclasses'),
 smalltalk.method({
 selector: unescape('allSubclasses'),
-fn: function (){
+fn: function () {
 var self=this;
 var result=nil;
 (result=smalltalk.send(self, "_subclasses", []));
@@ -43,18 +43,29 @@ smalltalk.addMethod(
 unescape('_basicNew'),
 smalltalk.method({
 selector: unescape('basicNew'),
-fn: function (){
+fn: function () {
 var self=this;
 return new self.fn();
 return self;}
 }),
 smalltalk.Behavior);
 
+smalltalk.addMethod(
+unescape('_canUnderstand_'),
+smalltalk.method({
+selector: unescape('canUnderstand%3A'),
+fn: function (aSelector) {
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_includes_", [smalltalk.send(aSelector, "_asString", [])]), "_or_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_superclass", []), "_notNil", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(self, "_superclass", []), "_canUnderstand_", [aSelector]);})]);})]);
+return self;}
+}),
+smalltalk.Behavior);
+
 smalltalk.addMethod(
 unescape('_comment'),
 smalltalk.method({
 selector: unescape('comment'),
-fn: function (){
+fn: function () {
 var self=this;
 return (($receiver = smalltalk.send(self, "_basicAt_", ["comment"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;}
@@ -65,7 +76,7 @@ smalltalk.addMethod(
 unescape('_comment_'),
 smalltalk.method({
 selector: unescape('comment%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 smalltalk.send(self, "_basicAt_put_", ["comment", aString]);
 return self;}
@@ -76,7 +87,7 @@ smalltalk.addMethod(
 unescape('_commentStamp'),
 smalltalk.method({
 selector: unescape('commentStamp'),
-fn: function (){
+fn: function () {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_class_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCommentReader || ClassCommentReader), "_new", []));
 return self;}
@@ -87,7 +98,7 @@ smalltalk.addMethod(
 unescape('_commentStamp_prior_'),
 smalltalk.method({
 selector: unescape('commentStamp%3Aprior%3A'),
-fn: function (aStamp, prior){
+fn: function (aStamp, prior) {
 var self=this;
 return smalltalk.send(self, "_commentStamp", []);
 return self;}
@@ -98,7 +109,7 @@ smalltalk.addMethod(
 unescape('_compile_'),
 smalltalk.method({
 selector: unescape('compile%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 smalltalk.send(self, "_compile_category_", [aString, ""]);
 return self;}
@@ -109,7 +120,7 @@ smalltalk.addMethod(
 unescape('_compile_category_'),
 smalltalk.method({
 selector: unescape('compile%3Acategory%3A'),
-fn: function (aString, anotherString){
+fn: function (aString, anotherString) {
 var self=this;
 var method=nil;
 (method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self]));
@@ -123,7 +134,7 @@ smalltalk.addMethod(
 unescape('_inheritsFrom_'),
 smalltalk.method({
 selector: unescape('inheritsFrom%3A'),
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 return smalltalk.send(smalltalk.send(aClass, "_allSubclasses", []), "_includes_", [self]);
 return self;}
@@ -134,7 +145,7 @@ smalltalk.addMethod(
 unescape('_instanceVariableNames'),
 smalltalk.method({
 selector: unescape('instanceVariableNames'),
-fn: function (){
+fn: function () {
 var self=this;
 return self.iVarNames;
 return self;}
@@ -145,7 +156,7 @@ smalltalk.addMethod(
 unescape('_methodAt_'),
 smalltalk.method({
 selector: unescape('methodAt%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 return smalltalk.methods(self)[aString];
 return self;}
@@ -156,7 +167,7 @@ smalltalk.addMethod(
 unescape('_methodDictionary'),
 smalltalk.method({
 selector: unescape('methodDictionary'),
-fn: function (){
+fn: function () {
 var self=this;
 var dict = smalltalk.HashedCollection._new();
 	var methods = self.fn.prototype.methods;
@@ -174,7 +185,7 @@ smalltalk.addMethod(
 unescape('_methodsFor_'),
 smalltalk.method({
 selector: unescape('methodsFor%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_class_category_", [self, aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCategoryReader || ClassCategoryReader), "_new", []));
 return self;}
@@ -185,7 +196,7 @@ smalltalk.addMethod(
 unescape('_methodsFor_stamp_'),
 smalltalk.method({
 selector: unescape('methodsFor%3Astamp%3A'),
-fn: function (aString, aStamp){
+fn: function (aString, aStamp) {
 var self=this;
 return smalltalk.send(self, "_methodsFor_", [aString]);
 return self;}
@@ -196,7 +207,7 @@ smalltalk.addMethod(
 unescape('_name'),
 smalltalk.method({
 selector: unescape('name'),
-fn: function (){
+fn: function () {
 var self=this;
 return self.className || nil;
 return self;}
@@ -207,7 +218,7 @@ smalltalk.addMethod(
 unescape('_new'),
 smalltalk.method({
 selector: unescape('new'),
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_basicNew", []), "_initialize", []);
 return self;}
@@ -218,7 +229,7 @@ smalltalk.addMethod(
 unescape('_protocols'),
 smalltalk.method({
 selector: unescape('protocols'),
-fn: function (){
+fn: function () {
 var self=this;
 var protocols=nil;
 (protocols=smalltalk.send((smalltalk.Array || Array), "_new", []));
@@ -232,7 +243,7 @@ smalltalk.addMethod(
 unescape('_protocolsDo_'),
 smalltalk.method({
 selector: unescape('protocolsDo%3A'),
-fn: function (aBlock){
+fn: function (aBlock) {
 var self=this;
 var methodsByCategory=nil;
 (methodsByCategory=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
@@ -246,7 +257,7 @@ smalltalk.addMethod(
 unescape('_prototype'),
 smalltalk.method({
 selector: unescape('prototype'),
-fn: function (){
+fn: function () {
 var self=this;
 return self.fn.prototype;
 return self;}
@@ -257,7 +268,7 @@ smalltalk.addMethod(
 unescape('_removeCompiledMethod_'),
 smalltalk.method({
 selector: unescape('removeCompiledMethod%3A'),
-fn: function (aMethod){
+fn: function (aMethod) {
 var self=this;
 delete self.fn.prototype[aMethod.selector._asSelector()];
 	delete self.fn.prototype.methods[aMethod.selector];
@@ -270,7 +281,7 @@ smalltalk.addMethod(
 unescape('_subclasses'),
 smalltalk.method({
 selector: unescape('subclasses'),
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.subclasses(self);
 return self;}
@@ -281,7 +292,7 @@ smalltalk.addMethod(
 unescape('_superclass'),
 smalltalk.method({
 selector: unescape('superclass'),
-fn: function (){
+fn: function () {
 var self=this;
 return self.superclass || nil;
 return self;}
@@ -292,7 +303,7 @@ smalltalk.addMethod(
 unescape('_withAllSubclasses'),
 smalltalk.method({
 selector: unescape('withAllSubclasses'),
-fn: function (){
+fn: function () {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_allSubclasses", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_with_", [self]));
 return self;}
@@ -306,7 +317,7 @@ smalltalk.addMethod(
 unescape('_category'),
 smalltalk.method({
 selector: unescape('category'),
-fn: function (){
+fn: function () {
 var self=this;
 return (($receiver = smalltalk.send(self, "_package", [])) == nil || $receiver == undefined) ? (function(){return "Unclassified";})() : (function(){return smalltalk.send(smalltalk.send(self, "_package", []), "_name", []);})();
 return self;}
@@ -317,7 +328,7 @@ smalltalk.addMethod(
 unescape('_isClass'),
 smalltalk.method({
 selector: unescape('isClass'),
-fn: function (){
+fn: function () {
 var self=this;
 return true;
 return self;}
@@ -328,7 +339,7 @@ smalltalk.addMethod(
 unescape('_package'),
 smalltalk.method({
 selector: unescape('package'),
-fn: function (){
+fn: function () {
 var self=this;
 return self.pkg;
 return self;}
@@ -339,7 +350,7 @@ smalltalk.addMethod(
 unescape('_package_'),
 smalltalk.method({
 selector: unescape('package%3A'),
-fn: function (aPackage){
+fn: function (aPackage) {
 var self=this;
 self.pkg = aPackage;
 return self;}
@@ -350,7 +361,7 @@ smalltalk.addMethod(
 unescape('_printString'),
 smalltalk.method({
 selector: unescape('printString'),
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.send(self, "_name", []);
 return self;}
@@ -361,7 +372,7 @@ smalltalk.addMethod(
 unescape('_rename_'),
 smalltalk.method({
 selector: unescape('rename%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 
 		smalltalk[aString] = self;
@@ -376,7 +387,7 @@ smalltalk.addMethod(
 unescape('_subclass_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3A'),
-fn: function (aString, anotherString){
+fn: function (aString, anotherString) {
 var self=this;
 return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
 return self;}
@@ -387,7 +398,7 @@ smalltalk.addMethod(
 unescape('_subclass_instanceVariableNames_category_'),
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
-fn: function (aString, aString2, aString3){
+fn: function (aString, aString2, aString3) {
 var self=this;
 smalltalk.send(self, "_deprecatedAPI", []);
 return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
@@ -399,7 +410,7 @@ smalltalk.addMethod(
 unescape('_subclass_instanceVariableNames_classVariableNames_poolDictionaries_category_'),
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3AclassVariableNames%3ApoolDictionaries%3Acategory%3A'),
-fn: function (aString, aString2, classVars, pools, aString3){
+fn: function (aString, aString2, classVars, pools, aString3) {
 var self=this;
 return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
 return self;}
@@ -410,7 +421,7 @@ smalltalk.addMethod(
 unescape('_subclass_instanceVariableNames_package_'),
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3Apackage%3A'),
-fn: function (aString, aString2, aString3){
+fn: function (aString, aString2, aString3) {
 var self=this;
 return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_package_", [self, smalltalk.send(aString, "_asString", []), aString2, aString3]);
 return self;}
@@ -424,7 +435,7 @@ smalltalk.addMethod(
 unescape('_instanceClass'),
 smalltalk.method({
 selector: unescape('instanceClass'),
-fn: function (){
+fn: function () {
 var self=this;
 return self.instanceClass;
 return self;}
@@ -435,7 +446,7 @@ smalltalk.addMethod(
 unescape('_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('instanceVariableNames%3A'),
-fn: function (aCollection){
+fn: function (aCollection) {
 var self=this;
 smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_class_instanceVariableNames_", [self, aCollection]);
 return self;}
@@ -446,7 +457,7 @@ smalltalk.addMethod(
 unescape('_isMetaclass'),
 smalltalk.method({
 selector: unescape('isMetaclass'),
-fn: function (){
+fn: function () {
 var self=this;
 return true;
 return self;}
@@ -457,7 +468,7 @@ smalltalk.addMethod(
 unescape('_printString'),
 smalltalk.method({
 selector: unescape('printString'),
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.send(smalltalk.send(smalltalk.send(self, "_instanceClass", []), "_name", []), "__comma", [" class"]);
 return self;}
@@ -471,7 +482,7 @@ smalltalk.addMethod(
 unescape('_addSubclassOf_named_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3A'),
-fn: function (aClass, aString, aCollection){
+fn: function (aClass, aString, aCollection) {
 var self=this;
 smalltalk.addClass(aString, aClass, aCollection);
 	    return smalltalk[aString];
@@ -483,7 +494,7 @@ smalltalk.addMethod(
 unescape('_addSubclassOf_named_instanceVariableNames_package_'),
 smalltalk.method({
 selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3Apackage%3A'),
-fn: function (aClass, aString, aCollection, packageName){
+fn: function (aClass, aString, aCollection, packageName) {
 var self=this;
 smalltalk.addClass(aString, aClass, aCollection, packageName);
 	    return smalltalk[aString];
@@ -495,7 +506,7 @@ smalltalk.addMethod(
 unescape('_class_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('class%3AinstanceVariableNames%3A'),
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_name", []), "__comma", [" is not a metaclass"])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_name", []), "__comma", [" is not a metaclass"])]);})]));
 smalltalk.send(aClass, "_basicAt_put_", ["iVarNames", smalltalk.send(self, "_instanceVariableNamesFor_", [aString])]);
@@ -508,7 +519,7 @@ smalltalk.addMethod(
 unescape('_copyClass_named_'),
 smalltalk.method({
 selector: unescape('copyClass%3Anamed%3A'),
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 var newClass=nil;
 (newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), aString, smalltalk.send(aClass, "_instanceVariableNames", []), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]));
@@ -525,7 +536,7 @@ smalltalk.addMethod(
 unescape('_instanceVariableNamesFor_'),
 smalltalk.method({
 selector: unescape('instanceVariableNamesFor%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 return smalltalk.send(smalltalk.send(aString, "_tokenize_", [" "]), "_reject_", [(function(each){return smalltalk.send(each, "_isEmpty", []);})]);
 return self;}
@@ -536,7 +547,7 @@ smalltalk.addMethod(
 unescape('_setupClass_'),
 smalltalk.method({
 selector: unescape('setupClass%3A'),
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 smalltalk.init(aClass);;
 return self;}
@@ -547,7 +558,7 @@ smalltalk.addMethod(
 unescape('_superclass_subclass_'),
 smalltalk.method({
 selector: unescape('superclass%3Asubclass%3A'),
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_package_", [aClass, aString, "", nil]);
 return self;}
@@ -558,7 +569,7 @@ smalltalk.addMethod(
 unescape('_superclass_subclass_instanceVariableNames_package_'),
 smalltalk.method({
 selector: unescape('superclass%3Asubclass%3AinstanceVariableNames%3Apackage%3A'),
-fn: function (aClass, aString, aString2, aString3){
+fn: function (aClass, aString, aString2, aString3) {
 var self=this;
 var newClass=nil;
 (newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [aClass, aString, smalltalk.send(self, "_instanceVariableNamesFor_", [aString2]), (($receiver = aString3) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : $receiver]));
@@ -575,7 +586,7 @@ smalltalk.addMethod(
 unescape('_class_category_'),
 smalltalk.method({
 selector: unescape('class%3Acategory%3A'),
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 (self['@class']=aClass);
 (self['@category']=aString);
@@ -587,7 +598,7 @@ smalltalk.addMethod(
 unescape('_compileMethod_'),
 smalltalk.method({
 selector: unescape('compileMethod%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 var method=nil;
 var compiler=nil;
@@ -603,7 +614,7 @@ smalltalk.addMethod(
 unescape('_initialize'),
 smalltalk.method({
 selector: unescape('initialize'),
-fn: function (){
+fn: function () {
 var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
 (self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
@@ -615,7 +626,7 @@ smalltalk.addMethod(
 unescape('_scanFrom_'),
 smalltalk.method({
 selector: unescape('scanFrom%3A'),
-fn: function (aChunkParser){
+fn: function (aChunkParser) {
 var self=this;
 var chunk=nil;
 (function(){while(!(function(){(chunk=smalltalk.send(aChunkParser, "_nextChunk", []));return smalltalk.send(chunk, "_isEmpty", []);})()) {(function(){return smalltalk.send(self, "_compileMethod_", [chunk]);})()}})();
@@ -630,7 +641,7 @@ smalltalk.addMethod(
 unescape('_class_'),
 smalltalk.method({
 selector: unescape('class%3A'),
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 (self['@class']=aClass);
 return self;}
@@ -641,7 +652,7 @@ smalltalk.addMethod(
 unescape('_initialize'),
 smalltalk.method({
 selector: unescape('initialize'),
-fn: function (){
+fn: function () {
 var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
 (self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
@@ -653,7 +664,7 @@ smalltalk.addMethod(
 unescape('_scanFrom_'),
 smalltalk.method({
 selector: unescape('scanFrom%3A'),
-fn: function (aChunkParser){
+fn: function (aChunkParser) {
 var self=this;
 var chunk=nil;
 (chunk=smalltalk.send(aChunkParser, "_nextChunk", []));
@@ -666,7 +677,7 @@ smalltalk.addMethod(
 unescape('_setComment_'),
 smalltalk.method({
 selector: unescape('setComment%3A'),
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 smalltalk.send(self['@class'], "_comment_", [aString]);
 return self;}
@@ -680,7 +691,7 @@ smalltalk.addMethod(
 unescape('_getNodesFrom_'),
 smalltalk.method({
 selector: unescape('getNodesFrom%3A'),
-fn: function (aCollection){
+fn: function (aCollection) {
 var self=this;
 var children=nil;
 var others=nil;
@@ -696,7 +707,7 @@ smalltalk.addMethod(
 unescape('_level'),
 smalltalk.method({
 selector: unescape('level'),
-fn: function (){
+fn: function () {
 var self=this;
 return self['@level'];
 return self;}
@@ -707,7 +718,7 @@ smalltalk.addMethod(
 unescape('_level_'),
 smalltalk.method({
 selector: unescape('level%3A'),
-fn: function (anInteger){
+fn: function (anInteger) {
 var self=this;
 (self['@level']=anInteger);
 return self;}
@@ -718,7 +729,7 @@ smalltalk.addMethod(
 unescape('_nodes'),
 smalltalk.method({
 selector: unescape('nodes'),
-fn: function (){
+fn: function () {
 var self=this;
 return self['@nodes'];
 return self;}
@@ -729,7 +740,7 @@ smalltalk.addMethod(
 unescape('_theClass'),
 smalltalk.method({
 selector: unescape('theClass'),
-fn: function (){
+fn: function () {
 var self=this;
 return self['@theClass'];
 return self;}
@@ -740,7 +751,7 @@ smalltalk.addMethod(
 unescape('_theClass_'),
 smalltalk.method({
 selector: unescape('theClass%3A'),
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 (self['@theClass']=aClass);
 return self;}
@@ -751,7 +762,7 @@ smalltalk.addMethod(
 unescape('_traverseClassesWith_'),
 smalltalk.method({
 selector: unescape('traverseClassesWith%3A'),
-fn: function (aCollection){
+fn: function (aCollection) {
 var self=this;
 smalltalk.send(aCollection, "_add_", [smalltalk.send(self, "_theClass", [])]);
 smalltalk.send(smalltalk.send(smalltalk.send(self, "_nodes", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(smalltalk.send(a, "_theClass", []), "_name", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", [])]));})]), "_do_", [(function(aNode){return smalltalk.send(aNode, "_traverseClassesWith_", [aCollection]);})]);
@@ -764,7 +775,7 @@ smalltalk.addMethod(
 unescape('_on_classes_level_'),
 smalltalk.method({
 selector: unescape('on%3Aclasses%3Alevel%3A'),
-fn: function (aClass, aCollection, anInteger){
+fn: function (aClass, aCollection, anInteger) {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;}

+ 79 - 63
js/Kernel-Classes.js

@@ -6,7 +6,7 @@ unescape('_addCompiledMethod_'),
 smalltalk.method({
 selector: unescape('addCompiledMethod%3A'),
 category: 'compiling',
-fn: function (aMethod){
+fn: function (aMethod) {
 var self=this;
 smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
 return self;},
@@ -22,7 +22,7 @@ unescape('_allInstanceVariableNames'),
 smalltalk.method({
 selector: unescape('allInstanceVariableNames'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 var result=nil;
 (result=smalltalk.send(smalltalk.send(self, "_instanceVariableNames", []), "_copy", []));
@@ -41,7 +41,7 @@ unescape('_allSubclasses'),
 smalltalk.method({
 selector: unescape('allSubclasses'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 var result=nil;
 (result=smalltalk.send(self, "_subclasses", []));
@@ -60,7 +60,7 @@ unescape('_basicNew'),
 smalltalk.method({
 selector: unescape('basicNew'),
 category: 'instance creation',
-fn: function (){
+fn: function () {
 var self=this;
 return new self.fn();
 return self;},
@@ -71,12 +71,28 @@ referencedClasses: []
 }),
 smalltalk.Behavior);
 
+smalltalk.addMethod(
+unescape('_canUnderstand_'),
+smalltalk.method({
+selector: unescape('canUnderstand%3A'),
+category: 'testing',
+fn: function (aSelector) {
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_includes_", [smalltalk.send(aSelector, "_asString", [])]), "_or_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(self, "_superclass", []), "_notNil", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(self, "_superclass", []), "_canUnderstand_", [aSelector]);})]);})]);
+return self;},
+args: ["aSelector"],
+source: unescape('canUnderstand%3A%20aSelector%0A%09%5E%28self%20methodDictionary%20keys%20includes%3A%20aSelector%20asString%29%20or%3A%20%5B%0A%09%09self%20superclass%20notNil%20and%3A%20%5Bself%20superclass%20canUnderstand%3A%20aSelector%5D%5D'),
+messageSends: ["or:", "includes:", "keys", "methodDictionary", "asString", "and:", "notNil", "superclass", "canUnderstand:"],
+referencedClasses: []
+}),
+smalltalk.Behavior);
+
 smalltalk.addMethod(
 unescape('_comment'),
 smalltalk.method({
 selector: unescape('comment'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return (($receiver = smalltalk.send(self, "_basicAt_", ["comment"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
 return self;},
@@ -92,7 +108,7 @@ unescape('_comment_'),
 smalltalk.method({
 selector: unescape('comment%3A'),
 category: 'accessing',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 smalltalk.send(self, "_basicAt_put_", ["comment", aString]);
 return self;},
@@ -108,7 +124,7 @@ unescape('_commentStamp'),
 smalltalk.method({
 selector: unescape('commentStamp'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_class_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCommentReader || ClassCommentReader), "_new", []));
 return self;},
@@ -124,7 +140,7 @@ unescape('_commentStamp_prior_'),
 smalltalk.method({
 selector: unescape('commentStamp%3Aprior%3A'),
 category: 'accessing',
-fn: function (aStamp, prior){
+fn: function (aStamp, prior) {
 var self=this;
 return smalltalk.send(self, "_commentStamp", []);
 return self;},
@@ -140,7 +156,7 @@ unescape('_compile_'),
 smalltalk.method({
 selector: unescape('compile%3A'),
 category: 'compiling',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 smalltalk.send(self, "_compile_category_", [aString, ""]);
 return self;},
@@ -156,7 +172,7 @@ unescape('_compile_category_'),
 smalltalk.method({
 selector: unescape('compile%3Acategory%3A'),
 category: 'compiling',
-fn: function (aString, anotherString){
+fn: function (aString, anotherString) {
 var self=this;
 var method=nil;
 (method=smalltalk.send(smalltalk.send((smalltalk.Compiler || Compiler), "_new", []), "_load_forClass_", [aString, self]));
@@ -175,7 +191,7 @@ unescape('_inheritsFrom_'),
 smalltalk.method({
 selector: unescape('inheritsFrom%3A'),
 category: 'testing',
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 return smalltalk.send(smalltalk.send(aClass, "_allSubclasses", []), "_includes_", [self]);
 return self;},
@@ -191,7 +207,7 @@ unescape('_instanceVariableNames'),
 smalltalk.method({
 selector: unescape('instanceVariableNames'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self.iVarNames;
 return self;},
@@ -207,7 +223,7 @@ unescape('_methodAt_'),
 smalltalk.method({
 selector: unescape('methodAt%3A'),
 category: 'accessing',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 return smalltalk.methods(self)[aString];
 return self;},
@@ -223,7 +239,7 @@ unescape('_methodDictionary'),
 smalltalk.method({
 selector: unescape('methodDictionary'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 var dict = smalltalk.HashedCollection._new();
 	var methods = self.fn.prototype.methods;
@@ -246,7 +262,7 @@ unescape('_methodsFor_'),
 smalltalk.method({
 selector: unescape('methodsFor%3A'),
 category: 'accessing',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_class_category_", [self, aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassCategoryReader || ClassCategoryReader), "_new", []));
 return self;},
@@ -262,7 +278,7 @@ unescape('_methodsFor_stamp_'),
 smalltalk.method({
 selector: unescape('methodsFor%3Astamp%3A'),
 category: 'accessing',
-fn: function (aString, aStamp){
+fn: function (aString, aStamp) {
 var self=this;
 return smalltalk.send(self, "_methodsFor_", [aString]);
 return self;},
@@ -278,7 +294,7 @@ unescape('_name'),
 smalltalk.method({
 selector: unescape('name'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self.className || nil;
 return self;},
@@ -294,7 +310,7 @@ unescape('_new'),
 smalltalk.method({
 selector: unescape('new'),
 category: 'instance creation',
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_basicNew", []), "_initialize", []);
 return self;},
@@ -310,7 +326,7 @@ unescape('_protocols'),
 smalltalk.method({
 selector: unescape('protocols'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 var protocols=nil;
 (protocols=smalltalk.send((smalltalk.Array || Array), "_new", []));
@@ -329,7 +345,7 @@ unescape('_protocolsDo_'),
 smalltalk.method({
 selector: unescape('protocolsDo%3A'),
 category: 'accessing',
-fn: function (aBlock){
+fn: function (aBlock) {
 var self=this;
 var methodsByCategory=nil;
 (methodsByCategory=smalltalk.send((smalltalk.HashedCollection || HashedCollection), "_new", []));
@@ -348,7 +364,7 @@ unescape('_prototype'),
 smalltalk.method({
 selector: unescape('prototype'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self.fn.prototype;
 return self;},
@@ -364,7 +380,7 @@ unescape('_removeCompiledMethod_'),
 smalltalk.method({
 selector: unescape('removeCompiledMethod%3A'),
 category: 'compiling',
-fn: function (aMethod){
+fn: function (aMethod) {
 var self=this;
 delete self.fn.prototype[aMethod.selector._asSelector()];
 	delete self.fn.prototype.methods[aMethod.selector];
@@ -382,7 +398,7 @@ unescape('_subclasses'),
 smalltalk.method({
 selector: unescape('subclasses'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.subclasses(self);
 return self;},
@@ -398,7 +414,7 @@ unescape('_superclass'),
 smalltalk.method({
 selector: unescape('superclass'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self.superclass || nil;
 return self;},
@@ -414,7 +430,7 @@ unescape('_withAllSubclasses'),
 smalltalk.method({
 selector: unescape('withAllSubclasses'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_addAll_", [smalltalk.send(self, "_allSubclasses", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_with_", [self]));
 return self;},
@@ -434,7 +450,7 @@ unescape('_category'),
 smalltalk.method({
 selector: unescape('category'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return (($receiver = smalltalk.send(self, "_package", [])) == nil || $receiver == undefined) ? (function(){return "Unclassified";})() : (function(){return smalltalk.send(smalltalk.send(self, "_package", []), "_name", []);})();
 return self;},
@@ -450,7 +466,7 @@ unescape('_isClass'),
 smalltalk.method({
 selector: unescape('isClass'),
 category: 'testing',
-fn: function (){
+fn: function () {
 var self=this;
 return true;
 return self;},
@@ -466,7 +482,7 @@ unescape('_package'),
 smalltalk.method({
 selector: unescape('package'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self.pkg;
 return self;},
@@ -482,7 +498,7 @@ unescape('_package_'),
 smalltalk.method({
 selector: unescape('package%3A'),
 category: 'accessing',
-fn: function (aPackage){
+fn: function (aPackage) {
 var self=this;
 self.pkg = aPackage;
 return self;},
@@ -498,7 +514,7 @@ unescape('_printString'),
 smalltalk.method({
 selector: unescape('printString'),
 category: 'printing',
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.send(self, "_name", []);
 return self;},
@@ -514,7 +530,7 @@ unescape('_rename_'),
 smalltalk.method({
 selector: unescape('rename%3A'),
 category: 'accessing',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 
 		smalltalk[aString] = self;
@@ -534,7 +550,7 @@ unescape('_subclass_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3A'),
 category: 'class creation',
-fn: function (aString, anotherString){
+fn: function (aString, anotherString) {
 var self=this;
 return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, anotherString, nil]);
 return self;},
@@ -550,7 +566,7 @@ unescape('_subclass_instanceVariableNames_category_'),
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3Acategory%3A'),
 category: 'class creation',
-fn: function (aString, aString2, aString3){
+fn: function (aString, aString2, aString3) {
 var self=this;
 smalltalk.send(self, "_deprecatedAPI", []);
 return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
@@ -567,7 +583,7 @@ unescape('_subclass_instanceVariableNames_classVariableNames_poolDictionaries_ca
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3AclassVariableNames%3ApoolDictionaries%3Acategory%3A'),
 category: 'class creation',
-fn: function (aString, aString2, classVars, pools, aString3){
+fn: function (aString, aString2, classVars, pools, aString3) {
 var self=this;
 return smalltalk.send(self, "_subclass_instanceVariableNames_package_", [aString, aString2, aString3]);
 return self;},
@@ -583,7 +599,7 @@ unescape('_subclass_instanceVariableNames_package_'),
 smalltalk.method({
 selector: unescape('subclass%3AinstanceVariableNames%3Apackage%3A'),
 category: 'class creation',
-fn: function (aString, aString2, aString3){
+fn: function (aString, aString2, aString3) {
 var self=this;
 return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_package_", [self, smalltalk.send(aString, "_asString", []), aString2, aString3]);
 return self;},
@@ -603,7 +619,7 @@ unescape('_instanceClass'),
 smalltalk.method({
 selector: unescape('instanceClass'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self.instanceClass;
 return self;},
@@ -619,7 +635,7 @@ unescape('_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('instanceVariableNames%3A'),
 category: 'accessing',
-fn: function (aCollection){
+fn: function (aCollection) {
 var self=this;
 smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_class_instanceVariableNames_", [self, aCollection]);
 return self;},
@@ -635,7 +651,7 @@ unescape('_isMetaclass'),
 smalltalk.method({
 selector: unescape('isMetaclass'),
 category: 'testing',
-fn: function (){
+fn: function () {
 var self=this;
 return true;
 return self;},
@@ -651,7 +667,7 @@ unescape('_printString'),
 smalltalk.method({
 selector: unescape('printString'),
 category: 'printing',
-fn: function (){
+fn: function () {
 var self=this;
 return smalltalk.send(smalltalk.send(smalltalk.send(self, "_instanceClass", []), "_name", []), "__comma", [" class"]);
 return self;},
@@ -671,7 +687,7 @@ unescape('_addSubclassOf_named_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3A'),
 category: 'private',
-fn: function (aClass, aString, aCollection){
+fn: function (aClass, aString, aCollection) {
 var self=this;
 smalltalk.addClass(aString, aClass, aCollection);
 	    return smalltalk[aString];
@@ -688,7 +704,7 @@ unescape('_addSubclassOf_named_instanceVariableNames_package_'),
 smalltalk.method({
 selector: unescape('addSubclassOf%3Anamed%3AinstanceVariableNames%3Apackage%3A'),
 category: 'private',
-fn: function (aClass, aString, aCollection, packageName){
+fn: function (aClass, aString, aCollection, packageName) {
 var self=this;
 smalltalk.addClass(aString, aClass, aCollection, packageName);
 	    return smalltalk[aString];
@@ -705,7 +721,7 @@ unescape('_class_instanceVariableNames_'),
 smalltalk.method({
 selector: unescape('class%3AinstanceVariableNames%3A'),
 category: 'class creation',
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 ((($receiver = smalltalk.send(aClass, "_isMetaclass", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_name", []), "__comma", [" is not a metaclass"])]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_name", []), "__comma", [" is not a metaclass"])]);})]));
 smalltalk.send(aClass, "_basicAt_put_", ["iVarNames", smalltalk.send(self, "_instanceVariableNamesFor_", [aString])]);
@@ -723,7 +739,7 @@ unescape('_copyClass_named_'),
 smalltalk.method({
 selector: unescape('copyClass%3Anamed%3A'),
 category: 'private',
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 var newClass=nil;
 (newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [smalltalk.send(aClass, "_superclass", []), aString, smalltalk.send(aClass, "_instanceVariableNames", []), smalltalk.send(smalltalk.send(aClass, "_package", []), "_name", [])]));
@@ -745,7 +761,7 @@ unescape('_instanceVariableNamesFor_'),
 smalltalk.method({
 selector: unescape('instanceVariableNamesFor%3A'),
 category: 'private',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 return smalltalk.send(smalltalk.send(aString, "_tokenize_", [" "]), "_reject_", [(function(each){return smalltalk.send(each, "_isEmpty", []);})]);
 return self;},
@@ -761,7 +777,7 @@ unescape('_setupClass_'),
 smalltalk.method({
 selector: unescape('setupClass%3A'),
 category: 'private',
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 smalltalk.init(aClass);;
 return self;},
@@ -777,7 +793,7 @@ unescape('_superclass_subclass_'),
 smalltalk.method({
 selector: unescape('superclass%3Asubclass%3A'),
 category: 'class creation',
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_package_", [aClass, aString, "", nil]);
 return self;},
@@ -793,7 +809,7 @@ unescape('_superclass_subclass_instanceVariableNames_package_'),
 smalltalk.method({
 selector: unescape('superclass%3Asubclass%3AinstanceVariableNames%3Apackage%3A'),
 category: 'class creation',
-fn: function (aClass, aString, aString2, aString3){
+fn: function (aClass, aString, aString2, aString3) {
 var self=this;
 var newClass=nil;
 (newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_package_", [aClass, aString, smalltalk.send(self, "_instanceVariableNamesFor_", [aString2]), (($receiver = aString3) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : $receiver]));
@@ -816,7 +832,7 @@ unescape('_class_category_'),
 smalltalk.method({
 selector: unescape('class%3Acategory%3A'),
 category: 'accessing',
-fn: function (aClass, aString){
+fn: function (aClass, aString) {
 var self=this;
 (self['@class']=aClass);
 (self['@category']=aString);
@@ -833,7 +849,7 @@ unescape('_compileMethod_'),
 smalltalk.method({
 selector: unescape('compileMethod%3A'),
 category: 'private',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 var method=nil;
 var compiler=nil;
@@ -854,7 +870,7 @@ unescape('_initialize'),
 smalltalk.method({
 selector: unescape('initialize'),
 category: 'initialization',
-fn: function (){
+fn: function () {
 var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
 (self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
@@ -871,7 +887,7 @@ unescape('_scanFrom_'),
 smalltalk.method({
 selector: unescape('scanFrom%3A'),
 category: 'fileIn',
-fn: function (aChunkParser){
+fn: function (aChunkParser) {
 var self=this;
 var chunk=nil;
 (function(){while(!(function(){(chunk=smalltalk.send(aChunkParser, "_nextChunk", []));return smalltalk.send(chunk, "_isEmpty", []);})()) {(function(){return smalltalk.send(self, "_compileMethod_", [chunk]);})()}})();
@@ -892,7 +908,7 @@ unescape('_class_'),
 smalltalk.method({
 selector: unescape('class%3A'),
 category: 'accessing',
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 (self['@class']=aClass);
 return self;},
@@ -908,7 +924,7 @@ unescape('_initialize'),
 smalltalk.method({
 selector: unescape('initialize'),
 category: 'initialization',
-fn: function (){
+fn: function () {
 var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
 (self['@chunkParser']=smalltalk.send((smalltalk.ChunkParser || ChunkParser), "_new", []));
@@ -925,7 +941,7 @@ unescape('_scanFrom_'),
 smalltalk.method({
 selector: unescape('scanFrom%3A'),
 category: 'fileIn',
-fn: function (aChunkParser){
+fn: function (aChunkParser) {
 var self=this;
 var chunk=nil;
 (chunk=smalltalk.send(aChunkParser, "_nextChunk", []));
@@ -943,7 +959,7 @@ unescape('_setComment_'),
 smalltalk.method({
 selector: unescape('setComment%3A'),
 category: 'private',
-fn: function (aString){
+fn: function (aString) {
 var self=this;
 smalltalk.send(self['@class'], "_comment_", [aString]);
 return self;},
@@ -962,7 +978,7 @@ unescape('_getNodesFrom_'),
 smalltalk.method({
 selector: unescape('getNodesFrom%3A'),
 category: 'accessing',
-fn: function (aCollection){
+fn: function (aCollection) {
 var self=this;
 var children=nil;
 var others=nil;
@@ -983,7 +999,7 @@ unescape('_level'),
 smalltalk.method({
 selector: unescape('level'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self['@level'];
 return self;},
@@ -999,7 +1015,7 @@ unescape('_level_'),
 smalltalk.method({
 selector: unescape('level%3A'),
 category: 'accessing',
-fn: function (anInteger){
+fn: function (anInteger) {
 var self=this;
 (self['@level']=anInteger);
 return self;},
@@ -1015,7 +1031,7 @@ unescape('_nodes'),
 smalltalk.method({
 selector: unescape('nodes'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self['@nodes'];
 return self;},
@@ -1031,7 +1047,7 @@ unescape('_theClass'),
 smalltalk.method({
 selector: unescape('theClass'),
 category: 'accessing',
-fn: function (){
+fn: function () {
 var self=this;
 return self['@theClass'];
 return self;},
@@ -1047,7 +1063,7 @@ unescape('_theClass_'),
 smalltalk.method({
 selector: unescape('theClass%3A'),
 category: 'accessing',
-fn: function (aClass){
+fn: function (aClass) {
 var self=this;
 (self['@theClass']=aClass);
 return self;},
@@ -1063,7 +1079,7 @@ unescape('_traverseClassesWith_'),
 smalltalk.method({
 selector: unescape('traverseClassesWith%3A'),
 category: 'visiting',
-fn: function (aCollection){
+fn: function (aCollection) {
 var self=this;
 smalltalk.send(aCollection, "_add_", [smalltalk.send(self, "_theClass", [])]);
 smalltalk.send(smalltalk.send(smalltalk.send(self, "_nodes", []), "_sorted_", [(function(a, b){return ((($receiver = smalltalk.send(smalltalk.send(a, "_theClass", []), "_name", [])).klass === smalltalk.Number) ? $receiver <=smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", []) : smalltalk.send($receiver, "__lt_eq", [smalltalk.send(smalltalk.send(b, "_theClass", []), "_name", [])]));})]), "_do_", [(function(aNode){return smalltalk.send(aNode, "_traverseClassesWith_", [aCollection]);})]);
@@ -1081,7 +1097,7 @@ unescape('_on_classes_level_'),
 smalltalk.method({
 selector: unescape('on%3Aclasses%3Alevel%3A'),
 category: 'instance creation',
-fn: function (aClass, aCollection, anInteger){
+fn: function (aClass, aCollection, anInteger) {
 var self=this;
 return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);smalltalk.send($rec, "_level_", [anInteger]);smalltalk.send($rec, "_getNodesFrom_", [aCollection]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},

+ 38 - 4
js/Kernel-Objects.deploy.js

@@ -486,10 +486,11 @@ unescape('_perform_withArguments_'),
 smalltalk.method({
 selector: unescape('perform%3AwithArguments%3A'),
 fn: function (aSymbol, aCollection) {
-    var self = this;
-    return smalltalk.send(self, "_basicPerform_withArguments_", [smalltalk.send(aSymbol, "_asSelector", []), aCollection]);
-    return self;
-}
+var self=this;
+var selector=nil;
+(selector=smalltalk.send(aSymbol, "_asSelector", []));
+return smalltalk.send(self, selector, aCollection);
+return self;}
 }),
 smalltalk.Object);
 
@@ -528,6 +529,17 @@ fn: function () {
 }),
 smalltalk.Object);
 
+smalltalk.addMethod(
+unescape('_respondsTo_'),
+smalltalk.method({
+selector: unescape('respondsTo%3A'),
+fn: function (aSelector) {
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_class", []), "_canUnderstand_", [aSelector]);
+return self;}
+}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 unescape('_shallowCopy'),
 smalltalk.method({
@@ -1470,6 +1482,17 @@ smalltalk.JSObjectProxy.klass);
 
 
 smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel-Objects');
+smalltalk.addMethod(
+unescape('_%26'),
+smalltalk.method({
+selector: unescape('%26'),
+fn: function (aNumber) {
+var self=this;
+return self & aNumber;
+return self;}
+}),
+smalltalk.Number);
+
 smalltalk.addMethod(
 unescape('__star'),
 smalltalk.method({
@@ -1997,6 +2020,17 @@ fn: function () {
 }),
 smalltalk.Number);
 
+smalltalk.addMethod(
+unescape('_%7C'),
+smalltalk.method({
+selector: unescape('%7C'),
+fn: function (aNumber) {
+var self=this;
+return self | aNumber;
+return self;}
+}),
+smalltalk.Number);
+
 
 smalltalk.addMethod(
 unescape('_pi'),

+ 55 - 6
js/Kernel-Objects.js

@@ -683,13 +683,14 @@ smalltalk.method({
 selector: unescape('perform%3AwithArguments%3A'),
 category: 'message handling',
 fn: function (aSymbol, aCollection) {
-    var self = this;
-    return smalltalk.send(self, "_basicPerform_withArguments_", [smalltalk.send(aSymbol, "_asSelector", []), aCollection]);
-    return self;
-},
+var self=this;
+var selector=nil;
+(selector=smalltalk.send(aSymbol, "_asSelector", []));
+return smalltalk.send(self, selector, aCollection);
+return self;},
 args: ["aSymbol", "aCollection"],
-source: unescape('perform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%5Eself%20basicPerform%3A%20aSymbol%20asSelector%20withArguments%3A%20aCollection'),
-messageSends: ["basicPerform:withArguments:", "asSelector"],
+source: unescape('perform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%7C%20selector%20%7C%0A%09selector%20%3A%3D%20aSymbol%20asSelector.%0A%09%3Creturn%20smalltalk.send%28self%2C%20selector%2C%20aCollection%29%3E'),
+messageSends: ["asSelector"],
 referencedClasses: []
 }),
 smalltalk.Object);
@@ -744,6 +745,22 @@ referencedClasses: []
 }),
 smalltalk.Object);
 
+smalltalk.addMethod(
+unescape('_respondsTo_'),
+smalltalk.method({
+selector: unescape('respondsTo%3A'),
+category: 'testing',
+fn: function (aSelector) {
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_class", []), "_canUnderstand_", [aSelector]);
+return self;},
+args: ["aSelector"],
+source: unescape('respondsTo%3A%20aSelector%0A%09%5Eself%20class%20canUnderstand%3A%20aSelector'),
+messageSends: ["canUnderstand:", "class"],
+referencedClasses: []
+}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 unescape('_shallowCopy'),
 smalltalk.method({
@@ -2055,6 +2072,22 @@ smalltalk.JSObjectProxy.klass);
 
 smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel-Objects');
 smalltalk.Number.comment=unescape('Number%20holds%20the%20most%20general%20methods%20for%20dealing%20with%20numbers.%20%20%0ANumber%20is%20directly%20mapped%20to%20JavaScript%20Number.%0A%0AMost%20arithmetic%20methods%20like%20%60%23+%60%20%60%23/%60%20%60%23-%60%20%60%23max%3A%60%20are%20directly%20inlined%20into%20javascript.%20%0A%0A%23%23Enumerating%0AA%20Number%20can%20be%20used%20to%20evaluate%20a%20Block%20a%20fixed%20number%20of%20times%3A%0A%0A%095%20timesRepeat%3A%20%5BTranscript%20show%3A%20%27This%20will%20be%20printed%205%20times%27%3B%20cr%5D.%0A%09%0A%091%20to%3A%205%20do%3A%20%5B%3AaNumber%7C%20Transcript%20show%3A%20aNumber%20asString%3B%20cr%5D.%0A%09%0A%091%20to%3A%2010%20by%3A%202%20do%3A%20%5B%3AaNumber%7C%20Transcript%20show%3A%20aNumber%20asString%3B%20cr%5D.')
+smalltalk.addMethod(
+unescape('_%26'),
+smalltalk.method({
+selector: unescape('%26'),
+category: 'converting',
+fn: function (aNumber) {
+var self=this;
+return self & aNumber;
+return self;},
+args: ["aNumber"],
+source: unescape('%26%20aNumber%0A%09%3Creturn%20self%20%26%20aNumber%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Number);
+
 smalltalk.addMethod(
 unescape('__star'),
 smalltalk.method({
@@ -2787,6 +2820,22 @@ referencedClasses: []
 }),
 smalltalk.Number);
 
+smalltalk.addMethod(
+unescape('_%7C'),
+smalltalk.method({
+selector: unescape('%7C'),
+category: 'converting',
+fn: function (aNumber) {
+var self=this;
+return self | aNumber;
+return self;},
+args: ["aNumber"],
+source: unescape('%7C%20aNumber%0A%09%3Creturn%20self%20%7C%20aNumber%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Number);
+
 
 smalltalk.addMethod(
 unescape('_pi'),

+ 5 - 0
st/Kernel-Classes.st

@@ -154,6 +154,11 @@ new
 
 !Behavior methodsFor: 'testing'!
 
+canUnderstand: aSelector
+	^(self methodDictionary keys includes: aSelector asString) or: [
+		self superclass notNil and: [self superclass canUnderstand: aSelector]]
+!
+
 inheritsFrom: aClass
 	^aClass allSubclasses includes: self
 ! !

+ 15 - 1
st/Kernel-Objects.st

@@ -215,7 +215,9 @@ perform: aSymbol
 !
 
 perform: aSymbol withArguments: aCollection
-	^self basicPerform: aSymbol asSelector withArguments: aCollection
+	| selector |
+	selector := aSymbol asSelector.
+	<return smalltalk.send(self, selector, aCollection)>
 ! !
 
 !Object methodsFor: 'printing'!
@@ -308,6 +310,10 @@ isSymbol
 
 notNil
 	^self isNil not
+!
+
+respondsTo: aSelector
+	^self class canUnderstand: aSelector
 ! !
 
 !Object class methodsFor: 'initialization'!
@@ -785,6 +791,10 @@ squared
 
 !Number methodsFor: 'converting'!
 
+& aNumber
+	<return self & aNumber>
+!
+
 @ aNumber
 	^Point x: self y: aNumber
 !
@@ -852,6 +862,10 @@ truncated
         ifFalse: [<result = (Math.floor(self * (-1)) * (-1));>].
 
     ^ result
+!
+
+| aNumber
+	<return self | aNumber>
 ! !
 
 !Number methodsFor: 'copying'!