Browse Source

Message >> sendTo: and Smalltalk >> send:to:arguments:

Nicolas Petton 12 years ago
parent
commit
a7b9726a67
6 changed files with 1693 additions and 1251 deletions
  1. 323 260
      js/Kernel-Methods.deploy.js
  2. 395 327
      js/Kernel-Methods.js
  3. 340 282
      js/Kernel-Objects.deploy.js
  4. 340 282
      js/Kernel-Objects.js
  5. 104 100
      st/Kernel-Methods.st
  6. 191 0
      st/Kernel-Objects.st

+ 323 - 260
js/Kernel-Methods.deploy.js

@@ -1,136 +1,163 @@
 smalltalk.addPackage('Kernel-Methods', {});
-smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('source'),
-fn: function (){
-var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", ["source"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
-return self;}
+selector: unescape('selector'),
+fn: function () {
+    var self = this;
+    return self['@selector'];
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('source%3A'),
-fn: function (aString){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["source", aString]);
-return self;}
+selector: unescape('selector%3A'),
+fn: function (aString) {
+    var self = this;
+    self['@selector'] = aString;
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_category'),
+unescape('_arguments_'),
 smalltalk.method({
-selector: unescape('category'),
-fn: function (){
-var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
-return self;}
+selector: unescape('arguments%3A'),
+fn: function (anArray) {
+    var self = this;
+    self['@arguments'] = anArray;
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_category_'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('category%3A'),
-fn: function (aString){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["category", aString]);
-return self;}
+selector: unescape('arguments'),
+fn: function () {
+    var self = this;
+    return self['@arguments'];
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('selector'),
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["selector"]);
-return self;}
+selector: unescape('printString'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (aStream) {return function ($rec) {smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);}(aStream);}]);
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_sendTo_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-fn: function (aString){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
-return self;}
+selector: unescape('sendTo%3A'),
+fn: function (anObject) {
+    var self = this;
+    smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_send_to_arguments_", [smalltalk.send(self, "_selector", []), anObject, smalltalk.send(self, "_arguments", [])]);
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
+
 
 smalltalk.addMethod(
-unescape('_fn'),
+unescape('_selector_arguments_'),
 smalltalk.method({
-selector: unescape('fn'),
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["fn"]);
-return self;}
+selector: unescape('selector%3Aarguments%3A'),
+fn: function (aString, anArray) {
+    var self = this;
+    return function ($rec) {smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message.klass);
+
 
+smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_fn_'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('fn%3A'),
-fn: function (aBlock){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
-return self;}
+selector: unescape('receiver'),
+fn: function () {
+    var self = this;
+    return self.receiver;
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_messageSends'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('messageSends'),
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["messageSends"]);
-return self;}
+selector: unescape('selector'),
+fn: function () {
+    var self = this;
+    return smalltalk.convertSelector(self.selector);
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_methodClass'),
+unescape('_home'),
 smalltalk.method({
-selector: unescape('methodClass'),
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["methodClass"]);
-return self;}
+selector: unescape('home'),
+fn: function () {
+    var self = this;
+    return self.homeContext;
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_referencedClasses'),
+unescape('_temps'),
 smalltalk.method({
-selector: unescape('referencedClasses'),
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
-return self;}
+selector: unescape('temps'),
+fn: function () {
+    var self = this;
+    return self.temps;
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('arguments'),
-fn: function (){
-var self=this;
-return self.args || [];
-return self;}
+selector: unescape('printString'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
+    return self;
+}
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
+
+smalltalk.addMethod(
+unescape('_asString'),
+smalltalk.method({
+selector: unescape('asString'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
+    return self;
+}
+}),
+smalltalk.MethodContext);
 
 
 
@@ -139,10 +166,11 @@ smalltalk.addMethod(
 unescape('_compiledSource'),
 smalltalk.method({
 selector: unescape('compiledSource'),
-fn: function (){
-var self=this;
-return self.toString();
-return self;}
+fn: function () {
+    var self = this;
+    return self.toString();
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -150,10 +178,13 @@ smalltalk.addMethod(
 unescape('_whileTrue_'),
 smalltalk.method({
 selector: unescape('whileTrue%3A'),
-fn: function (aBlock){
-var self=this;
-while(self()) {aBlock()};
-return self;}
+fn: function (aBlock) {
+    var self = this;
+    while (self()) {
+        aBlock();
+    }
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -161,10 +192,13 @@ smalltalk.addMethod(
 unescape('_whileFalse_'),
 smalltalk.method({
 selector: unescape('whileFalse%3A'),
-fn: function (aBlock){
-var self=this;
-while(!self()) {aBlock()};
-return self;}
+fn: function (aBlock) {
+    var self = this;
+    while (!self()) {
+        aBlock();
+    }
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -172,10 +206,11 @@ smalltalk.addMethod(
 unescape('_value'),
 smalltalk.method({
 selector: unescape('value'),
-fn: function (){
-var self=this;
-return self();;
-return self;}
+fn: function () {
+    var self = this;
+    return self();
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -183,10 +218,11 @@ smalltalk.addMethod(
 unescape('_value_'),
 smalltalk.method({
 selector: unescape('value%3A'),
-fn: function (anArg){
-var self=this;
-return self(anArg);;
-return self;}
+fn: function (anArg) {
+    var self = this;
+    return self(anArg);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -194,10 +230,11 @@ smalltalk.addMethod(
 unescape('_value_value_'),
 smalltalk.method({
 selector: unescape('value%3Avalue%3A'),
-fn: function (firstArg, secondArg){
-var self=this;
-return self(firstArg, secondArg);;
-return self;}
+fn: function (firstArg, secondArg) {
+    var self = this;
+    return self(firstArg, secondArg);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -205,10 +242,11 @@ smalltalk.addMethod(
 unescape('_value_value_value_'),
 smalltalk.method({
 selector: unescape('value%3Avalue%3Avalue%3A'),
-fn: function (firstArg, secondArg, thirdArg){
-var self=this;
-return self(firstArg, secondArg, thirdArg);;
-return self;}
+fn: function (firstArg, secondArg, thirdArg) {
+    var self = this;
+    return self(firstArg, secondArg, thirdArg);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -216,10 +254,11 @@ smalltalk.addMethod(
 unescape('_valueWithPossibleArguments_'),
 smalltalk.method({
 selector: unescape('valueWithPossibleArguments%3A'),
-fn: function (aCollection){
-var self=this;
-return self.apply(null, aCollection);;
-return self;}
+fn: function (aCollection) {
+    var self = this;
+    return self.apply(null, aCollection);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -227,10 +266,11 @@ smalltalk.addMethod(
 unescape('_on_do_'),
 smalltalk.method({
 selector: unescape('on%3Ado%3A'),
-fn: function (anErrorClass, aBlock){
-var self=this;
-return smalltalk.send(self, "_try_catch_", [self, (function(error){return ((($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aBlock, "_value_", [error]);})() : (function(){return smalltalk.send(error, "_signal", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value_", [error]);}), (function(){return smalltalk.send(error, "_signal", []);})]));})]);
-return self;}
+fn: function (anErrorClass, aBlock) {
+    var self = this;
+    return smalltalk.send(self, "_try_catch_", [self, function (error) {return ($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(aBlock, "_value_", [error]);}() : function () {return smalltalk.send(error, "_signal", []);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return smalltalk.send(aBlock, "_value_", [error]);}, function () {return smalltalk.send(error, "_signal", []);}]);}]);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -238,10 +278,11 @@ smalltalk.addMethod(
 unescape('_valueWithTimeout_'),
 smalltalk.method({
 selector: unescape('valueWithTimeout%3A'),
-fn: function (aNumber){
-var self=this;
-return setTimeout(self, aNumber);
-return self;}
+fn: function (aNumber) {
+    var self = this;
+    return setTimeout(self, aNumber);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -249,10 +290,11 @@ smalltalk.addMethod(
 unescape('_valueWithInterval_'),
 smalltalk.method({
 selector: unescape('valueWithInterval%3A'),
-fn: function (aNumber){
-var self=this;
-return setInterval(self, aNumber);
-return self;}
+fn: function (aNumber) {
+    var self = this;
+    return setInterval(self, aNumber);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -260,10 +302,11 @@ smalltalk.addMethod(
 unescape('_whileFalse'),
 smalltalk.method({
 selector: unescape('whileFalse'),
-fn: function (){
-var self=this;
-smalltalk.send(self, "_whileFalse_", [(function(){return nil;})]);
-return self;}
+fn: function () {
+    var self = this;
+    smalltalk.send(self, "_whileFalse_", [function () {return nil;}]);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -271,10 +314,11 @@ smalltalk.addMethod(
 unescape('_whileTrue'),
 smalltalk.method({
 selector: unescape('whileTrue'),
-fn: function (){
-var self=this;
-smalltalk.send(self, "_whileTrue_", [(function(){return nil;})]);
-return self;}
+fn: function () {
+    var self = this;
+    smalltalk.send(self, "_whileTrue_", [function () {return nil;}]);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -282,10 +326,11 @@ smalltalk.addMethod(
 unescape('_new'),
 smalltalk.method({
 selector: unescape('new'),
-fn: function (){
-var self=this;
-return new self();
-return self;}
+fn: function () {
+    var self = this;
+    return new self;
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -293,10 +338,11 @@ smalltalk.addMethod(
 unescape('_applyTo_arguments_'),
 smalltalk.method({
 selector: unescape('applyTo%3Aarguments%3A'),
-fn: function (anObject, aCollection){
-var self=this;
-return self.apply(anObject, aCollection);
-return self;}
+fn: function (anObject, aCollection) {
+    var self = this;
+    return self.apply(anObject, aCollection);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -304,10 +350,11 @@ smalltalk.addMethod(
 unescape('_timeToRun'),
 smalltalk.method({
 selector: unescape('timeToRun'),
-fn: function (){
-var self=this;
-return smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [self]);
-return self;}
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [self]);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -315,10 +362,11 @@ smalltalk.addMethod(
 unescape('_numArgs'),
 smalltalk.method({
 selector: unescape('numArgs'),
-fn: function (){
-var self=this;
-return self.length;
-return self;}
+fn: function () {
+    var self = this;
+    return self.length;
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -326,12 +374,13 @@ smalltalk.addMethod(
 unescape('_ensure_'),
 smalltalk.method({
 selector: unescape('ensure%3A'),
-fn: function (aBlock){
-var self=this;
-var success=nil;
-(success=false);
-return smalltalk.send((function(){smalltalk.send(self, "_value", []);(success=true);return smalltalk.send(aBlock, "_value", []);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){((($receiver = success).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value", []);})]));return smalltalk.send(ex, "_signal", []);})]);
-return self;}
+fn: function (aBlock) {
+    var self = this;
+    var success = nil;
+    success = false;
+    return smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {($receiver = success).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(aBlock, "_value", []);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(aBlock, "_value", []);}]);return smalltalk.send(ex, "_signal", []);}]);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -339,10 +388,11 @@ smalltalk.addMethod(
 unescape('_newValue_'),
 smalltalk.method({
 selector: unescape('newValue%3A'),
-fn: function (anObject){
-var self=this;
-return new self(anObject);
-return self;}
+fn: function (anObject) {
+    var self = this;
+    return new self(anObject);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -350,10 +400,11 @@ smalltalk.addMethod(
 unescape('_newValue_value_'),
 smalltalk.method({
 selector: unescape('newValue%3Avalue%3A'),
-fn: function (anObject, anObject2){
-var self=this;
-return new self(anObject, anObject2);
-return self;}
+fn: function (anObject, anObject2) {
+    var self = this;
+    return new self(anObject, anObject2);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
@@ -361,150 +412,162 @@ smalltalk.addMethod(
 unescape('_newValue_value_value_'),
 smalltalk.method({
 selector: unescape('newValue%3Avalue%3Avalue%3A'),
-fn: function (anObject, anObject2, anObject3){
-var self=this;
-return new self(anObject, anObject2);
-return self;}
+fn: function (anObject, anObject2, anObject3) {
+    var self = this;
+    return new self(anObject, anObject2);
+    return self;
+}
 }),
 smalltalk.BlockClosure);
 
 
 
-smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('receiver'),
-fn: function (){
-var self=this;
-return self.receiver;
-return self;}
+selector: unescape('source'),
+fn: function () {
+    var self = this;
+    return ($receiver = smalltalk.send(self, "_basicAt_", ["source"])) == nil ||
+        $receiver == undefined ? function () {return "";}() : $receiver;
+    return self;
+}
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_source_'),
 smalltalk.method({
-selector: unescape('selector'),
-fn: function (){
-var self=this;
-return smalltalk.convertSelector(self.selector);
-return self;}
+selector: unescape('source%3A'),
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["source", aString]);
+    return self;
+}
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_home'),
+unescape('_category'),
 smalltalk.method({
-selector: unescape('home'),
-fn: function (){
-var self=this;
-return self.homeContext;
-return self;}
+selector: unescape('category'),
+fn: function () {
+    var self = this;
+    return ($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil ||
+        $receiver == undefined ? function () {return "";}() : $receiver;
+    return self;
+}
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_temps'),
+unescape('_category_'),
 smalltalk.method({
-selector: unescape('temps'),
-fn: function (){
-var self=this;
-return self.temps;
-return self;}
+selector: unescape('category%3A'),
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["category", aString]);
+    return self;
+}
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
-return self;}
+selector: unescape('selector'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["selector"]);
+    return self;
+}
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('asString'),
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
-return self;}
+selector: unescape('selector%3A'),
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
+    return self;
+}
 }),
-smalltalk.MethodContext);
-
-
+smalltalk.CompiledMethod);
 
-smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_fn'),
 smalltalk.method({
-selector: unescape('selector'),
-fn: function (){
-var self=this;
-return self['@selector'];
-return self;}
+selector: unescape('fn'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["fn"]);
+    return self;
+}
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_fn_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-fn: function (aString){
-var self=this;
-(self['@selector']=aString);
-return self;}
+selector: unescape('fn%3A'),
+fn: function (aBlock) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
+    return self;
+}
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_arguments_'),
+unescape('_messageSends'),
 smalltalk.method({
-selector: unescape('arguments%3A'),
-fn: function (anArray){
-var self=this;
-(self['@arguments']=anArray);
-return self;}
+selector: unescape('messageSends'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["messageSends"]);
+    return self;
+}
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_methodClass'),
 smalltalk.method({
-selector: unescape('arguments'),
-fn: function (){
-var self=this;
-return self['@arguments'];
-return self;}
+selector: unescape('methodClass'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["methodClass"]);
+    return self;
+}
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_referencedClasses'),
 smalltalk.method({
-selector: unescape('printString'),
-fn: function (){
-var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);})(aStream);})]);
-return self;}
+selector: unescape('referencedClasses'),
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
+    return self;
+}
 }),
-smalltalk.Message);
-
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_selector_arguments_'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('selector%3Aarguments%3A'),
-fn: function (aString, anArray){
-var self=this;
-return (function($rec){smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
-return self;}
+selector: unescape('arguments'),
+fn: function () {
+    var self = this;
+    return self.args || [];
+    return self;
+}
 }),
-smalltalk.Message.klass);
+smalltalk.CompiledMethod);
+
 
 

+ 395 - 327
js/Kernel-Methods.js

@@ -1,197 +1,230 @@
 smalltalk.addPackage('Kernel-Methods', {});
-smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
-smalltalk.CompiledMethod.comment=unescape('CompiledMethod%20hold%20the%20source%20and%20compiled%20code%20of%20a%20class%20method.%0A%0AYou%20can%20get%20a%20CompiledMethod%20using%20%60Behavior%3E%3EmethodAt%3A%60%0A%0A%09String%20methodAt%3A%20%27lines%27%0A%0Aand%20read%20the%20source%20code%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20source%0A%0ASee%20referenced%20classes%3A%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20referencedClasses%0A%0Aor%20messages%20sent%20from%20this%20method%3A%0A%09%0A%09%28String%20methodAt%3A%20%27lines%27%29%20%20messageSends')
+smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
+smalltalk.Message.comment=unescape('Generally%2C%20the%20system%20does%20not%20use%20instances%20of%20Message%20for%20efficiency%20reasons.%0AHowever%2C%20when%20a%20message%20is%20not%20understood%20by%20its%20receiver%2C%20the%20interpreter%20will%20make%20up%20an%20instance%20of%20it%20in%20order%20to%20capture%20the%20information%20involved%20in%20an%20actual%20message%20transmission.%20%0AThis%20instance%20is%20sent%20it%20as%20an%20argument%20with%20the%20message%20%60doesNotUnderstand%3A%60%20to%20the%20receiver.%0A%0ASee%20boot.js%2C%20%60messageNotUnderstood%60%20%20and%20its%20counterpart%20%60Object%3E%3EdoesNotUnderstand%3A%60')
 smalltalk.addMethod(
-unescape('_source'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('source'),
+selector: unescape('selector'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", ["source"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
-return self;},
+fn: function () {
+    var self = this;
+    return self['@selector'];
+    return self;
+},
 args: [],
-source: unescape('source%0A%09%5E%28self%20basicAt%3A%20%27source%27%29%20ifNil%3A%20%5B%27%27%5D'),
-messageSends: ["ifNil:", "basicAt:"],
+source: unescape('selector%0A%09%5Eselector'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_source_'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('source%3A'),
+selector: unescape('selector%3A'),
 category: 'accessing',
-fn: function (aString){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["source", aString]);
-return self;},
+fn: function (aString) {
+    var self = this;
+    self['@selector'] = aString;
+    return self;
+},
 args: ["aString"],
-source: unescape('source%3A%20aString%0A%09self%20basicAt%3A%20%27source%27%20put%3A%20aString'),
-messageSends: ["basicAt:put:"],
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_category'),
+unescape('_arguments_'),
 smalltalk.method({
-selector: unescape('category'),
+selector: unescape('arguments%3A'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return (($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil || $receiver == undefined) ? (function(){return "";})() : $receiver;
-return self;},
-args: [],
-source: unescape('category%0A%09%5E%28self%20basicAt%3A%20%27category%27%29%20ifNil%3A%20%5B%27%27%5D'),
-messageSends: ["ifNil:", "basicAt:"],
+fn: function (anArray) {
+    var self = this;
+    self['@arguments'] = anArray;
+    return self;
+},
+args: ["anArray"],
+source: unescape('arguments%3A%20anArray%0A%09arguments%20%3A%3D%20anArray'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_category_'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('category%3A'),
+selector: unescape('arguments'),
 category: 'accessing',
-fn: function (aString){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["category", aString]);
-return self;},
-args: ["aString"],
-source: unescape('category%3A%20aString%0A%09self%20basicAt%3A%20%27category%27%20put%3A%20aString'),
-messageSends: ["basicAt:put:"],
+fn: function () {
+    var self = this;
+    return self['@arguments'];
+    return self;
+},
+args: [],
+source: unescape('arguments%0A%09%5Earguments'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('selector'),
-category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["selector"]);
-return self;},
+selector: unescape('printString'),
+category: 'printing',
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.String || String, "_streamContents_", [function (aStream) {return function ($rec) {smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);}(aStream);}]);
+    return self;
+},
 args: [],
-source: unescape('selector%0A%09%5Eself%20basicAt%3A%20%27selector%27'),
-messageSends: ["basicAt:"],
-referencedClasses: []
+source: unescape('printString%0A%09%5E%20String%20streamContents%3A%20%5B%3AaStream%7C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09aStream%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20super%20printString%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%28%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20selector%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%29%27%20%09%09%09%09%5D'),
+messageSends: ["streamContents:", "nextPutAll:", "printString"],
+referencedClasses: ["String"]
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_sendTo_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
-category: 'accessing',
-fn: function (aString){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
-return self;},
-args: ["aString"],
-source: unescape('selector%3A%20aString%0A%09self%20basicAt%3A%20%27selector%27%20put%3A%20aString'),
-messageSends: ["basicAt:put:"],
+selector: unescape('sendTo%3A'),
+category: 'printing',
+fn: function (anObject) {
+    var self = this;
+    smalltalk.send(smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []), "_send_to_arguments_", [smalltalk.send(self, "_selector", []), anObject, smalltalk.send(self, "_arguments", [])]);
+    return self;
+},
+args: ["anObject"],
+source: unescape('sendTo%3A%20anObject%0A%09Smalltalk%20current%20send%3A%20self%20selector%20to%3A%20anObject%20arguments%3A%20self%20arguments'),
+messageSends: ["send:to:arguments:", "current", "selector", "arguments"],
+referencedClasses: ["Smalltalk"]
+}),
+smalltalk.Message);
+
+
+smalltalk.addMethod(
+unescape('_selector_arguments_'),
+smalltalk.method({
+selector: unescape('selector%3Aarguments%3A'),
+category: 'instance creation',
+fn: function (aString, anArray) {
+    var self = this;
+    return function ($rec) {smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(self, "_new", []));
+    return self;
+},
+args: ["aString", "anArray"],
+source: unescape('selector%3A%20aString%20arguments%3A%20anArray%0A%09%5Eself%20new%0A%09%09selector%3A%20aString%3B%0A%09%09arguments%3A%20anArray%3B%0A%09%09yourself'),
+messageSends: ["selector:", "arguments:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.Message.klass);
+
 
+smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.MethodContext.comment=unescape('MethodContext%20holds%20all%20the%20dynamic%20state%20associated%20with%20the%20execution%20of%20either%20a%20method%20activation%20resulting%20from%20a%20message%20send.%20That%20is%20used%20to%20build%20the%20call%20stack%20while%20debugging.%0A%20%20%0AMethodContext%20instances%20are%20JavaScript%20%60SmalltalkMethodContext%60%20objects%20defined%20in%20boot.js%20%0A%0ACurrent%20limitation%3A%20MethodContext%20instances%20are%20not%20created%20on%20Block%20evaluation.%20That%20means%20it%27s%20actually%20impossible%20to%20debug%20inside%20a%20Block.')
 smalltalk.addMethod(
-unescape('_fn'),
+unescape('_receiver'),
 smalltalk.method({
-selector: unescape('fn'),
+selector: unescape('receiver'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["fn"]);
-return self;},
+fn: function () {
+    var self = this;
+    return self.receiver;
+    return self;
+},
 args: [],
-source: unescape('fn%0A%09%5Eself%20basicAt%3A%20%27fn%27'),
-messageSends: ["basicAt:"],
+source: unescape('receiver%0A%09%3Creturn%20self.receiver%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_fn_'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('fn%3A'),
+selector: unescape('selector'),
 category: 'accessing',
-fn: function (aBlock){
-var self=this;
-smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
-return self;},
-args: ["aBlock"],
-source: unescape('fn%3A%20aBlock%0A%09self%20basicAt%3A%20%27fn%27%20put%3A%20aBlock'),
-messageSends: ["basicAt:put:"],
+fn: function () {
+    var self = this;
+    return smalltalk.convertSelector(self.selector);
+    return self;
+},
+args: [],
+source: unescape('selector%0A%09%3Creturn%20smalltalk.convertSelector%28self.selector%29%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_messageSends'),
+unescape('_home'),
 smalltalk.method({
-selector: unescape('messageSends'),
+selector: unescape('home'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["messageSends"]);
-return self;},
+fn: function () {
+    var self = this;
+    return self.homeContext;
+    return self;
+},
 args: [],
-source: unescape('messageSends%0A%09%5Eself%20basicAt%3A%20%27messageSends%27'),
-messageSends: ["basicAt:"],
+source: unescape('home%0A%09%3Creturn%20self.homeContext%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_methodClass'),
+unescape('_temps'),
 smalltalk.method({
-selector: unescape('methodClass'),
+selector: unescape('temps'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["methodClass"]);
-return self;},
+fn: function () {
+    var self = this;
+    return self.temps;
+    return self;
+},
 args: [],
-source: unescape('methodClass%0A%09%5Eself%20basicAt%3A%20%27methodClass%27'),
-messageSends: ["basicAt:"],
+source: unescape('temps%0A%09%3Creturn%20self.temps%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_referencedClasses'),
+unescape('_printString'),
 smalltalk.method({
-selector: unescape('referencedClasses'),
+selector: unescape('printString'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
-return self;},
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
+    return self;
+},
 args: [],
-source: unescape('referencedClasses%0A%09%5Eself%20basicAt%3A%20%27referencedClasses%27'),
-messageSends: ["basicAt:"],
+source: unescape('printString%0A%09%5Esuper%20printString%2C%20%27%28%27%2C%20self%20asString%2C%20%27%29%27'),
+messageSends: [unescape("%2C"), "printString", "asString"],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_asString'),
 smalltalk.method({
-selector: unescape('arguments'),
+selector: unescape('asString'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self.args || [];
-return self;},
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
+    return self;
+},
 args: [],
-source: unescape('arguments%0A%09%3Creturn%20self.args%20%7C%7C%20%5B%5D%3E'),
-messageSends: [],
+source: unescape('asString%0A%09%5Eself%20receiver%20class%20printString%2C%20%27%20%3E%3E%20%27%2C%20self%20selector'),
+messageSends: [unescape("%2C"), "printString", "class", "receiver", "selector"],
 referencedClasses: []
 }),
-smalltalk.CompiledMethod);
+smalltalk.MethodContext);
 
 
 
@@ -202,10 +235,11 @@ unescape('_compiledSource'),
 smalltalk.method({
 selector: unescape('compiledSource'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self.toString();
-return self;},
+fn: function () {
+    var self = this;
+    return self.toString();
+    return self;
+},
 args: [],
 source: unescape('compiledSource%0A%09%3Creturn%20self.toString%28%29%3E'),
 messageSends: [],
@@ -218,10 +252,13 @@ unescape('_whileTrue_'),
 smalltalk.method({
 selector: unescape('whileTrue%3A'),
 category: 'controlling',
-fn: function (aBlock){
-var self=this;
-while(self()) {aBlock()};
-return self;},
+fn: function (aBlock) {
+    var self = this;
+    while (self()) {
+        aBlock();
+    }
+    return self;
+},
 args: ["aBlock"],
 source: unescape('whileTrue%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Cwhile%28self%28%29%29%20%7BaBlock%28%29%7D%3E'),
 messageSends: [],
@@ -234,10 +271,13 @@ unescape('_whileFalse_'),
 smalltalk.method({
 selector: unescape('whileFalse%3A'),
 category: 'controlling',
-fn: function (aBlock){
-var self=this;
-while(!self()) {aBlock()};
-return self;},
+fn: function (aBlock) {
+    var self = this;
+    while (!self()) {
+        aBlock();
+    }
+    return self;
+},
 args: ["aBlock"],
 source: unescape('whileFalse%3A%20aBlock%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Cwhile%28%21self%28%29%29%20%7BaBlock%28%29%7D%3E'),
 messageSends: [],
@@ -250,10 +290,11 @@ unescape('_value'),
 smalltalk.method({
 selector: unescape('value'),
 category: 'evaluating',
-fn: function (){
-var self=this;
-return self();;
-return self;},
+fn: function () {
+    var self = this;
+    return self();
+    return self;
+},
 args: [],
 source: unescape('value%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%28%29%3B%3E'),
 messageSends: [],
@@ -266,10 +307,11 @@ unescape('_value_'),
 smalltalk.method({
 selector: unescape('value%3A'),
 category: 'evaluating',
-fn: function (anArg){
-var self=this;
-return self(anArg);;
-return self;},
+fn: function (anArg) {
+    var self = this;
+    return self(anArg);
+    return self;
+},
 args: ["anArg"],
 source: unescape('value%3A%20anArg%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%28anArg%29%3B%3E'),
 messageSends: [],
@@ -282,10 +324,11 @@ unescape('_value_value_'),
 smalltalk.method({
 selector: unescape('value%3Avalue%3A'),
 category: 'evaluating',
-fn: function (firstArg, secondArg){
-var self=this;
-return self(firstArg, secondArg);;
-return self;},
+fn: function (firstArg, secondArg) {
+    var self = this;
+    return self(firstArg, secondArg);
+    return self;
+},
 args: ["firstArg", "secondArg"],
 source: unescape('value%3A%20firstArg%20value%3A%20secondArg%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%28firstArg%2C%20secondArg%29%3B%3E'),
 messageSends: [],
@@ -298,10 +341,11 @@ unescape('_value_value_value_'),
 smalltalk.method({
 selector: unescape('value%3Avalue%3Avalue%3A'),
 category: 'evaluating',
-fn: function (firstArg, secondArg, thirdArg){
-var self=this;
-return self(firstArg, secondArg, thirdArg);;
-return self;},
+fn: function (firstArg, secondArg, thirdArg) {
+    var self = this;
+    return self(firstArg, secondArg, thirdArg);
+    return self;
+},
 args: ["firstArg", "secondArg", "thirdArg"],
 source: unescape('value%3A%20firstArg%20value%3A%20secondArg%20value%3A%20thirdArg%0A%09%22inlined%20in%20the%20Compiler%22%0A%09%3Creturn%20self%28firstArg%2C%20secondArg%2C%20thirdArg%29%3B%3E'),
 messageSends: [],
@@ -314,10 +358,11 @@ unescape('_valueWithPossibleArguments_'),
 smalltalk.method({
 selector: unescape('valueWithPossibleArguments%3A'),
 category: 'evaluating',
-fn: function (aCollection){
-var self=this;
-return self.apply(null, aCollection);;
-return self;},
+fn: function (aCollection) {
+    var self = this;
+    return self.apply(null, aCollection);
+    return self;
+},
 args: ["aCollection"],
 source: unescape('valueWithPossibleArguments%3A%20aCollection%0A%09%3Creturn%20self.apply%28null%2C%20aCollection%29%3B%3E'),
 messageSends: [],
@@ -330,10 +375,11 @@ unescape('_on_do_'),
 smalltalk.method({
 selector: unescape('on%3Ado%3A'),
 category: 'error handling',
-fn: function (anErrorClass, aBlock){
-var self=this;
-return smalltalk.send(self, "_try_catch_", [self, (function(error){return ((($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(aBlock, "_value_", [error]);})() : (function(){return smalltalk.send(error, "_signal", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value_", [error]);}), (function(){return smalltalk.send(error, "_signal", []);})]));})]);
-return self;},
+fn: function (anErrorClass, aBlock) {
+    var self = this;
+    return smalltalk.send(self, "_try_catch_", [self, function (error) {return ($receiver = smalltalk.send(error, "_isKindOf_", [anErrorClass])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(aBlock, "_value_", [error]);}() : function () {return smalltalk.send(error, "_signal", []);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return smalltalk.send(aBlock, "_value_", [error]);}, function () {return smalltalk.send(error, "_signal", []);}]);}]);
+    return self;
+},
 args: ["anErrorClass", "aBlock"],
 source: unescape('on%3A%20anErrorClass%20do%3A%20aBlock%0A%09%5Eself%20try%3A%20self%20catch%3A%20%5B%3Aerror%20%7C%0A%09%20%20%20%20%28error%20isKindOf%3A%20anErrorClass%29%20%0A%09%20%20%20%20%20ifTrue%3A%20%5BaBlock%20value%3A%20error%5D%0A%09%20%20%20%20%20ifFalse%3A%20%5Berror%20signal%5D%5D'),
 messageSends: ["try:catch:", "ifTrue:ifFalse:", "isKindOf:", "value:", "signal"],
@@ -346,10 +392,11 @@ unescape('_valueWithTimeout_'),
 smalltalk.method({
 selector: unescape('valueWithTimeout%3A'),
 category: 'timeout/interval',
-fn: function (aNumber){
-var self=this;
-return setTimeout(self, aNumber);
-return self;},
+fn: function (aNumber) {
+    var self = this;
+    return setTimeout(self, aNumber);
+    return self;
+},
 args: ["aNumber"],
 source: unescape('valueWithTimeout%3A%20aNumber%0A%09%3Creturn%20setTimeout%28self%2C%20aNumber%29%3E'),
 messageSends: [],
@@ -362,10 +409,11 @@ unescape('_valueWithInterval_'),
 smalltalk.method({
 selector: unescape('valueWithInterval%3A'),
 category: 'timeout/interval',
-fn: function (aNumber){
-var self=this;
-return setInterval(self, aNumber);
-return self;},
+fn: function (aNumber) {
+    var self = this;
+    return setInterval(self, aNumber);
+    return self;
+},
 args: ["aNumber"],
 source: unescape('valueWithInterval%3A%20aNumber%0A%09%3Creturn%20setInterval%28self%2C%20aNumber%29%3E'),
 messageSends: [],
@@ -378,10 +426,11 @@ unescape('_whileFalse'),
 smalltalk.method({
 selector: unescape('whileFalse'),
 category: 'controlling',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_whileFalse_", [(function(){return nil;})]);
-return self;},
+fn: function () {
+    var self = this;
+    smalltalk.send(self, "_whileFalse_", [function () {return nil;}]);
+    return self;
+},
 args: [],
 source: unescape('whileFalse%0A%09%22inlined%20in%20the%20Compiler%22%0A%09self%20whileFalse%3A%20%5B%5D'),
 messageSends: ["whileFalse:"],
@@ -394,10 +443,11 @@ unescape('_whileTrue'),
 smalltalk.method({
 selector: unescape('whileTrue'),
 category: 'controlling',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_whileTrue_", [(function(){return nil;})]);
-return self;},
+fn: function () {
+    var self = this;
+    smalltalk.send(self, "_whileTrue_", [function () {return nil;}]);
+    return self;
+},
 args: [],
 source: unescape('whileTrue%0A%09%22inlined%20in%20the%20Compiler%22%0A%09self%20whileTrue%3A%20%5B%5D'),
 messageSends: ["whileTrue:"],
@@ -410,10 +460,11 @@ unescape('_new'),
 smalltalk.method({
 selector: unescape('new'),
 category: 'evaluating',
-fn: function (){
-var self=this;
-return new self();
-return self;},
+fn: function () {
+    var self = this;
+    return new self;
+    return self;
+},
 args: [],
 source: unescape('new%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28%29%3E'),
 messageSends: [],
@@ -426,10 +477,11 @@ unescape('_applyTo_arguments_'),
 smalltalk.method({
 selector: unescape('applyTo%3Aarguments%3A'),
 category: 'evaluating',
-fn: function (anObject, aCollection){
-var self=this;
-return self.apply(anObject, aCollection);
-return self;},
+fn: function (anObject, aCollection) {
+    var self = this;
+    return self.apply(anObject, aCollection);
+    return self;
+},
 args: ["anObject", "aCollection"],
 source: unescape('applyTo%3A%20anObject%20arguments%3A%20aCollection%0A%09%3Creturn%20self.apply%28anObject%2C%20aCollection%29%3E'),
 messageSends: [],
@@ -442,10 +494,11 @@ unescape('_timeToRun'),
 smalltalk.method({
 selector: unescape('timeToRun'),
 category: 'evaluating',
-fn: function (){
-var self=this;
-return smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [self]);
-return self;},
+fn: function () {
+    var self = this;
+    return smalltalk.send(smalltalk.Date || Date, "_millisecondsToRun_", [self]);
+    return self;
+},
 args: [],
 source: unescape('timeToRun%0A%09%22Answer%20the%20number%20of%20milliseconds%20taken%20to%20execute%20this%20block.%22%0A%0A%09%5E%20Date%20millisecondsToRun%3A%20self'),
 messageSends: ["millisecondsToRun:"],
@@ -458,10 +511,11 @@ unescape('_numArgs'),
 smalltalk.method({
 selector: unescape('numArgs'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self.length;
-return self;},
+fn: function () {
+    var self = this;
+    return self.length;
+    return self;
+},
 args: [],
 source: unescape('numArgs%0A%09%3Creturn%20self.length%3E'),
 messageSends: [],
@@ -474,12 +528,13 @@ unescape('_ensure_'),
 smalltalk.method({
 selector: unescape('ensure%3A'),
 category: 'evaluating',
-fn: function (aBlock){
-var self=this;
-var success=nil;
-(success=false);
-return smalltalk.send((function(){smalltalk.send(self, "_value", []);(success=true);return smalltalk.send(aBlock, "_value", []);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){((($receiver = success).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(aBlock, "_value", []);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(aBlock, "_value", []);})]));return smalltalk.send(ex, "_signal", []);})]);
-return self;},
+fn: function (aBlock) {
+    var self = this;
+    var success = nil;
+    success = false;
+    return smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {($receiver = success).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(aBlock, "_value", []);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(aBlock, "_value", []);}]);return smalltalk.send(ex, "_signal", []);}]);
+    return self;
+},
 args: ["aBlock"],
 source: unescape('ensure%3A%20aBlock%0A%09%7C%20success%20%7C%0A%09success%20%3A%3D%20false.%0A%09%5E%5Bself%20value.%20success%20%3A%3D%20true.%20aBlock%20value%5D%0A%09%09on%3A%20Error%0A%09%09do%3A%20%5B%3Aex%20%7C%0A%09%09%09success%20ifFalse%3A%20%5BaBlock%20value%5D.%0A%09%09%09ex%20signal%5D'),
 messageSends: ["on:do:", "value", "ifFalse:", "signal"],
@@ -492,10 +547,11 @@ unescape('_newValue_'),
 smalltalk.method({
 selector: unescape('newValue%3A'),
 category: 'evaluating',
-fn: function (anObject){
-var self=this;
-return new self(anObject);
-return self;},
+fn: function (anObject) {
+    var self = this;
+    return new self(anObject);
+    return self;
+},
 args: ["anObject"],
 source: unescape('newValue%3A%20anObject%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%29%3E'),
 messageSends: [],
@@ -508,10 +564,11 @@ unescape('_newValue_value_'),
 smalltalk.method({
 selector: unescape('newValue%3Avalue%3A'),
 category: 'evaluating',
-fn: function (anObject, anObject2){
-var self=this;
-return new self(anObject, anObject2);
-return self;},
+fn: function (anObject, anObject2) {
+    var self = this;
+    return new self(anObject, anObject2);
+    return self;
+},
 args: ["anObject", "anObject2"],
 source: unescape('newValue%3A%20%20anObject%20value%3A%20anObject2%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%2C%20anObject2%29%3E'),
 messageSends: [],
@@ -524,10 +581,11 @@ unescape('_newValue_value_value_'),
 smalltalk.method({
 selector: unescape('newValue%3Avalue%3Avalue%3A'),
 category: 'evaluating',
-fn: function (anObject, anObject2, anObject3){
-var self=this;
-return new self(anObject, anObject2);
-return self;},
+fn: function (anObject, anObject2, anObject3) {
+    var self = this;
+    return new self(anObject, anObject2);
+    return self;
+},
 args: ["anObject", "anObject2", "anObject3"],
 source: unescape('newValue%3A%20%20anObject%20value%3A%20anObject2%20value%3A%20anObject3%0A%09%22Use%20the%20receiver%20as%20a%20JS%20constructor.%20%0A%09*Do%20not*%20use%20this%20method%20to%20instanciate%20Smalltalk%20objects%21%22%0A%09%3Creturn%20new%20self%28anObject%2C%20anObject2%29%3E'),
 messageSends: [],
@@ -537,203 +595,213 @@ smalltalk.BlockClosure);
 
 
 
-smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel-Methods');
-smalltalk.MethodContext.comment=unescape('MethodContext%20holds%20all%20the%20dynamic%20state%20associated%20with%20the%20execution%20of%20either%20a%20method%20activation%20resulting%20from%20a%20message%20send.%20That%20is%20used%20to%20build%20the%20call%20stack%20while%20debugging.%0A%20%20%0AMethodContext%20instances%20are%20JavaScript%20%60SmalltalkMethodContext%60%20objects%20defined%20in%20boot.js%20%0A%0ACurrent%20limitation%3A%20MethodContext%20instances%20are%20not%20created%20on%20Block%20evaluation.%20That%20means%20it%27s%20actually%20impossible%20to%20debug%20inside%20a%20Block.')
+smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel-Methods');
+smalltalk.CompiledMethod.comment=unescape('CompiledMethod%20hold%20the%20source%20and%20compiled%20code%20of%20a%20class%20method.%0A%0AYou%20can%20get%20a%20CompiledMethod%20using%20%60Behavior%3E%3EmethodAt%3A%60%0A%0A%09String%20methodAt%3A%20%27lines%27%0A%0Aand%20read%20the%20source%20code%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20source%0A%0ASee%20referenced%20classes%3A%0A%0A%09%28String%20methodAt%3A%20%27lines%27%29%20referencedClasses%0A%0Aor%20messages%20sent%20from%20this%20method%3A%0A%09%0A%09%28String%20methodAt%3A%20%27lines%27%29%20%20messageSends')
 smalltalk.addMethod(
-unescape('_receiver'),
+unescape('_source'),
 smalltalk.method({
-selector: unescape('receiver'),
+selector: unescape('source'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self.receiver;
-return self;},
+fn: function () {
+    var self = this;
+    return ($receiver = smalltalk.send(self, "_basicAt_", ["source"])) == nil ||
+        $receiver == undefined ? function () {return "";}() : $receiver;
+    return self;
+},
 args: [],
-source: unescape('receiver%0A%09%3Creturn%20self.receiver%3E'),
-messageSends: [],
+source: unescape('source%0A%09%5E%28self%20basicAt%3A%20%27source%27%29%20ifNil%3A%20%5B%27%27%5D'),
+messageSends: ["ifNil:", "basicAt:"],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_source_'),
 smalltalk.method({
-selector: unescape('selector'),
+selector: unescape('source%3A'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.convertSelector(self.selector);
-return self;},
-args: [],
-source: unescape('selector%0A%09%3Creturn%20smalltalk.convertSelector%28self.selector%29%3E'),
-messageSends: [],
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["source", aString]);
+    return self;
+},
+args: ["aString"],
+source: unescape('source%3A%20aString%0A%09self%20basicAt%3A%20%27source%27%20put%3A%20aString'),
+messageSends: ["basicAt:put:"],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_home'),
+unescape('_category'),
 smalltalk.method({
-selector: unescape('home'),
+selector: unescape('category'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self.homeContext;
-return self;},
+fn: function () {
+    var self = this;
+    return ($receiver = smalltalk.send(self, "_basicAt_", ["category"])) == nil ||
+        $receiver == undefined ? function () {return "";}() : $receiver;
+    return self;
+},
 args: [],
-source: unescape('home%0A%09%3Creturn%20self.homeContext%3E'),
-messageSends: [],
+source: unescape('category%0A%09%5E%28self%20basicAt%3A%20%27category%27%29%20ifNil%3A%20%5B%27%27%5D'),
+messageSends: ["ifNil:", "basicAt:"],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_temps'),
+unescape('_category_'),
 smalltalk.method({
-selector: unescape('temps'),
+selector: unescape('category%3A'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self.temps;
-return self;},
-args: [],
-source: unescape('temps%0A%09%3Creturn%20self.temps%3E'),
-messageSends: [],
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["category", aString]);
+    return self;
+},
+args: ["aString"],
+source: unescape('category%3A%20aString%0A%09self%20basicAt%3A%20%27category%27%20put%3A%20aString'),
+messageSends: ["basicAt:put:"],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_selector'),
 smalltalk.method({
-selector: unescape('printString'),
+selector: unescape('selector'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.Object), "__comma", [unescape("%28")]), "__comma", [smalltalk.send(self, "_asString", [])]), "__comma", [unescape("%29")]);
-return self;},
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["selector"]);
+    return self;
+},
 args: [],
-source: unescape('printString%0A%09%5Esuper%20printString%2C%20%27%28%27%2C%20self%20asString%2C%20%27%29%27'),
-messageSends: [unescape("%2C"), "printString", "asString"],
+source: unescape('selector%0A%09%5Eself%20basicAt%3A%20%27selector%27'),
+messageSends: ["basicAt:"],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_asString'),
+unescape('_selector_'),
 smalltalk.method({
-selector: unescape('asString'),
+selector: unescape('selector%3A'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_printString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(self, "_selector", [])]);
-return self;},
-args: [],
-source: unescape('asString%0A%09%5Eself%20receiver%20class%20printString%2C%20%27%20%3E%3E%20%27%2C%20self%20selector'),
-messageSends: [unescape("%2C"), "printString", "class", "receiver", "selector"],
+fn: function (aString) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["selector", aString]);
+    return self;
+},
+args: ["aString"],
+source: unescape('selector%3A%20aString%0A%09self%20basicAt%3A%20%27selector%27%20put%3A%20aString'),
+messageSends: ["basicAt:put:"],
 referencedClasses: []
 }),
-smalltalk.MethodContext);
-
-
+smalltalk.CompiledMethod);
 
-smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
-smalltalk.Message.comment=unescape('Generally%2C%20the%20system%20does%20not%20use%20instances%20of%20Message%20for%20efficiency%20reasons.%0AHowever%2C%20when%20a%20message%20is%20not%20understood%20by%20its%20receiver%2C%20the%20interpreter%20will%20make%20up%20an%20instance%20of%20it%20in%20order%20to%20capture%20the%20information%20involved%20in%20an%20actual%20message%20transmission.%20%0AThis%20instance%20is%20sent%20it%20as%20an%20argument%20with%20the%20message%20%60doesNotUnderstand%3A%60%20to%20the%20receiver.%0A%0ASee%20boot.js%2C%20%60messageNotUnderstood%60%20%20and%20its%20counterpart%20%60Object%3E%3EdoesNotUnderstand%3A%60')
 smalltalk.addMethod(
-unescape('_selector'),
+unescape('_fn'),
 smalltalk.method({
-selector: unescape('selector'),
+selector: unescape('fn'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self['@selector'];
-return self;},
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["fn"]);
+    return self;
+},
 args: [],
-source: unescape('selector%0A%09%5Eselector'),
-messageSends: [],
+source: unescape('fn%0A%09%5Eself%20basicAt%3A%20%27fn%27'),
+messageSends: ["basicAt:"],
 referencedClasses: []
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_selector_'),
+unescape('_fn_'),
 smalltalk.method({
-selector: unescape('selector%3A'),
+selector: unescape('fn%3A'),
 category: 'accessing',
-fn: function (aString){
-var self=this;
-(self['@selector']=aString);
-return self;},
-args: ["aString"],
-source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
-messageSends: [],
+fn: function (aBlock) {
+    var self = this;
+    smalltalk.send(self, "_basicAt_put_", ["fn", aBlock]);
+    return self;
+},
+args: ["aBlock"],
+source: unescape('fn%3A%20aBlock%0A%09self%20basicAt%3A%20%27fn%27%20put%3A%20aBlock'),
+messageSends: ["basicAt:put:"],
 referencedClasses: []
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_arguments_'),
+unescape('_messageSends'),
 smalltalk.method({
-selector: unescape('arguments%3A'),
+selector: unescape('messageSends'),
 category: 'accessing',
-fn: function (anArray){
-var self=this;
-(self['@arguments']=anArray);
-return self;},
-args: ["anArray"],
-source: unescape('arguments%3A%20anArray%0A%09arguments%20%3A%3D%20anArray'),
-messageSends: [],
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["messageSends"]);
+    return self;
+},
+args: [],
+source: unescape('messageSends%0A%09%5Eself%20basicAt%3A%20%27messageSends%27'),
+messageSends: ["basicAt:"],
 referencedClasses: []
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_arguments'),
+unescape('_methodClass'),
 smalltalk.method({
-selector: unescape('arguments'),
+selector: unescape('methodClass'),
 category: 'accessing',
-fn: function (){
-var self=this;
-return self['@arguments'];
-return self;},
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["methodClass"]);
+    return self;
+},
 args: [],
-source: unescape('arguments%0A%09%5Earguments'),
-messageSends: [],
+source: unescape('methodClass%0A%09%5Eself%20basicAt%3A%20%27methodClass%27'),
+messageSends: ["basicAt:"],
 referencedClasses: []
 }),
-smalltalk.Message);
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_printString'),
+unescape('_referencedClasses'),
 smalltalk.method({
-selector: unescape('printString'),
-category: 'printing',
-fn: function (){
-var self=this;
-return smalltalk.send((smalltalk.String || String), "_streamContents_", [(function(aStream){return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(self, "_printString", [], smalltalk.Object)]);smalltalk.send($rec, "_nextPutAll_", [unescape("%28")]);smalltalk.send($rec, "_nextPutAll_", [self['@selector']]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%29")]);})(aStream);})]);
-return self;},
+selector: unescape('referencedClasses'),
+category: 'accessing',
+fn: function () {
+    var self = this;
+    return smalltalk.send(self, "_basicAt_", ["referencedClasses"]);
+    return self;
+},
 args: [],
-source: unescape('printString%0A%09%5E%20String%20streamContents%3A%20%5B%3AaStream%7C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09aStream%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20super%20printString%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%28%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20selector%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09%09%09nextPutAll%3A%20%27%29%27%20%09%09%09%09%5D'),
-messageSends: ["streamContents:", "nextPutAll:", "printString"],
-referencedClasses: ["String"]
+source: unescape('referencedClasses%0A%09%5Eself%20basicAt%3A%20%27referencedClasses%27'),
+messageSends: ["basicAt:"],
+referencedClasses: []
 }),
-smalltalk.Message);
-
+smalltalk.CompiledMethod);
 
 smalltalk.addMethod(
-unescape('_selector_arguments_'),
+unescape('_arguments'),
 smalltalk.method({
-selector: unescape('selector%3Aarguments%3A'),
-category: 'instance creation',
-fn: function (aString, anArray){
-var self=this;
-return (function($rec){smalltalk.send($rec, "_selector_", [aString]);smalltalk.send($rec, "_arguments_", [anArray]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
-return self;},
-args: ["aString", "anArray"],
-source: unescape('selector%3A%20aString%20arguments%3A%20anArray%0A%09%5Eself%20new%0A%09%09selector%3A%20aString%3B%0A%09%09arguments%3A%20anArray%3B%0A%09%09yourself'),
-messageSends: ["selector:", "arguments:", "yourself", "new"],
+selector: unescape('arguments'),
+category: 'accessing',
+fn: function () {
+    var self = this;
+    return self.args || [];
+    return self;
+},
+args: [],
+source: unescape('arguments%0A%09%3Creturn%20self.args%20%7C%7C%20%5B%5D%3E'),
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.Message.klass);
+smalltalk.CompiledMethod);
+
 
 

File diff suppressed because it is too large
+ 340 - 282
js/Kernel-Objects.deploy.js


File diff suppressed because it is too large
+ 340 - 282
js/Kernel-Objects.js


+ 104 - 100
st/Kernel-Methods.st

@@ -1,74 +1,90 @@
 Smalltalk current createPackage: 'Kernel-Methods' properties: #{}!
-Object subclass: #CompiledMethod
-	instanceVariableNames: ''
+Object subclass: #Message
+	instanceVariableNames: 'selector arguments'
 	category: 'Kernel-Methods'!
-!CompiledMethod commentStamp!
-CompiledMethod hold the source and compiled code of a class method.
-
-You can get a CompiledMethod using `Behavior>>methodAt:`
+!Message commentStamp!
+Generally, the system does not use instances of Message for efficiency reasons.
+However, when a message is not understood by its receiver, the interpreter will make up an instance of it in order to capture the information involved in an actual message transmission. 
+This instance is sent it as an argument with the message `doesNotUnderstand:` to the receiver.
 
-	String methodAt: 'lines'
+See boot.js, `messageNotUnderstood`  and its counterpart `Object>>doesNotUnderstand:`!
 
-and read the source code
+!Message methodsFor: 'accessing'!
 
-	(String methodAt: 'lines') source
+selector
+	^selector
+!
 
-See referenced classes:
+selector: aString
+	selector := aString
+!
 
-	(String methodAt: 'lines') referencedClasses
+arguments: anArray
+	arguments := anArray
+!
 
-or messages sent from this method:
-	
-	(String methodAt: 'lines')  messageSends!
+arguments
+	^arguments
+! !
 
-!CompiledMethod methodsFor: 'accessing'!
+!Message methodsFor: 'printing'!
 
-source
-	^(self basicAt: 'source') ifNil: ['']
+printString
+	^ String streamContents: [:aStream|  
+                                  				aStream 
+                                  					nextPutAll: super printString;
+                                  					nextPutAll: '(';
+                                  					nextPutAll: selector;
+                                  					nextPutAll: ')' 				]
 !
 
-source: aString
-	self basicAt: 'source' put: aString
-!
+sendTo: anObject
+	Smalltalk current send: self selector to: anObject arguments: self arguments
+! !
 
-category
-	^(self basicAt: 'category') ifNil: ['']
-!
+!Message class methodsFor: 'instance creation'!
 
-category: aString
-	self basicAt: 'category' put: aString
-!
+selector: aString arguments: anArray
+	^self new
+		selector: aString;
+		arguments: anArray;
+		yourself
+! !
 
-selector
-	^self basicAt: 'selector'
-!
+Object subclass: #MethodContext
+	instanceVariableNames: ''
+	category: 'Kernel-Methods'!
+!MethodContext commentStamp!
+MethodContext holds all the dynamic state associated with the execution of either a method activation resulting from a message send. That is used to build the call stack while debugging.
+  
+MethodContext instances are JavaScript `SmalltalkMethodContext` objects defined in boot.js 
 
-selector: aString
-	self basicAt: 'selector' put: aString
-!
+Current limitation: MethodContext instances are not created on Block evaluation. That means it's actually impossible to debug inside a Block.!
 
-fn
-	^self basicAt: 'fn'
+!MethodContext methodsFor: 'accessing'!
+
+receiver
+	<return self.receiver>
 !
 
-fn: aBlock
-	self basicAt: 'fn' put: aBlock
+selector
+	<return smalltalk.convertSelector(self.selector)>
 !
 
-messageSends
-	^self basicAt: 'messageSends'
+home
+	<return self.homeContext>
 !
 
-methodClass
-	^self basicAt: 'methodClass'
+temps
+	<return self.temps>
 !
 
-referencedClasses
-	^self basicAt: 'referencedClasses'
+printString
+	^super printString, '(', self asString, ')'
 !
 
-arguments
-	<return self.args || []>
+asString
+	^self receiver class printString, ' >> ', self selector
 ! !
 
 Object subclass: #BlockClosure
@@ -201,87 +217,75 @@ valueWithInterval: aNumber
 	<return setInterval(self, aNumber)>
 ! !
 
-Object subclass: #MethodContext
+Object subclass: #CompiledMethod
 	instanceVariableNames: ''
 	category: 'Kernel-Methods'!
-!MethodContext commentStamp!
-MethodContext holds all the dynamic state associated with the execution of either a method activation resulting from a message send. That is used to build the call stack while debugging.
-  
-MethodContext instances are JavaScript `SmalltalkMethodContext` objects defined in boot.js 
+!CompiledMethod commentStamp!
+CompiledMethod hold the source and compiled code of a class method.
 
-Current limitation: MethodContext instances are not created on Block evaluation. That means it's actually impossible to debug inside a Block.!
+You can get a CompiledMethod using `Behavior>>methodAt:`
 
-!MethodContext methodsFor: 'accessing'!
+	String methodAt: 'lines'
 
-receiver
-	<return self.receiver>
-!
+and read the source code
 
-selector
-	<return smalltalk.convertSelector(self.selector)>
-!
+	(String methodAt: 'lines') source
 
-home
-	<return self.homeContext>
-!
+See referenced classes:
 
-temps
-	<return self.temps>
-!
+	(String methodAt: 'lines') referencedClasses
 
-printString
-	^super printString, '(', self asString, ')'
-!
+or messages sent from this method:
+	
+	(String methodAt: 'lines')  messageSends!
 
-asString
-	^self receiver class printString, ' >> ', self selector
-! !
+!CompiledMethod methodsFor: 'accessing'!
 
-Object subclass: #Message
-	instanceVariableNames: 'selector arguments'
-	category: 'Kernel-Methods'!
-!Message commentStamp!
-Generally, the system does not use instances of Message for efficiency reasons.
-However, when a message is not understood by its receiver, the interpreter will make up an instance of it in order to capture the information involved in an actual message transmission. 
-This instance is sent it as an argument with the message `doesNotUnderstand:` to the receiver.
+source
+	^(self basicAt: 'source') ifNil: ['']
+!
 
-See boot.js, `messageNotUnderstood`  and its counterpart `Object>>doesNotUnderstand:`!
+source: aString
+	self basicAt: 'source' put: aString
+!
 
-!Message methodsFor: 'accessing'!
+category
+	^(self basicAt: 'category') ifNil: ['']
+!
+
+category: aString
+	self basicAt: 'category' put: aString
+!
 
 selector
-	^selector
+	^self basicAt: 'selector'
 !
 
 selector: aString
-	selector := aString
+	self basicAt: 'selector' put: aString
 !
 
-arguments: anArray
-	arguments := anArray
+fn
+	^self basicAt: 'fn'
 !
 
-arguments
-	^arguments
-! !
+fn: aBlock
+	self basicAt: 'fn' put: aBlock
+!
 
-!Message methodsFor: 'printing'!
+messageSends
+	^self basicAt: 'messageSends'
+!
 
-printString
-	^ String streamContents: [:aStream|  
-                                  				aStream 
-                                  					nextPutAll: super printString;
-                                  					nextPutAll: '(';
-                                  					nextPutAll: selector;
-                                  					nextPutAll: ')' 				]
-! !
+methodClass
+	^self basicAt: 'methodClass'
+!
 
-!Message class methodsFor: 'instance creation'!
+referencedClasses
+	^self basicAt: 'referencedClasses'
+!
 
-selector: aString arguments: anArray
-	^self new
-		selector: aString;
-		arguments: anArray;
-		yourself
+arguments
+	<return self.args || []>
 ! !
 

+ 191 - 0
st/Kernel-Objects.st

@@ -384,6 +384,12 @@ reservedWords
 
 readJSObject: anObject
 	<return self.readJSObject(anObject)>
+!
+
+send: aSelector to: anObject arguments: aCollection
+	| selector |
+	selector := aSelector asString asSelector.
+	<self.send(anObject, selector, aCollection)>
 ! !
 
 !Smalltalk methodsFor: 'classes'!
@@ -1277,6 +1283,191 @@ new
 	    self error: 'You cannot create new instances of UndefinedObject. Use nil'
 ! !
 
+Object subclass: #Date
+	instanceVariableNames: ''
+	category: 'Kernel-Objects'!
+!Date commentStamp!
+The Date class is used to work with dates and times. Therefore `Date today` and `Date now` are both valid in
+Amber and answer the same date object.
+
+Date wraps the `Date()` JavaScript constructor, and Smalltalk date objects are JavaScript date objects.!
+
+!Date methodsFor: 'accessing'!
+
+year
+	<return self.getFullYear()>
+!
+
+month
+	<return self.getMonth() + 1>
+!
+
+month: aNumber
+	<self.setMonth(aNumber - 1)>
+!
+
+day
+	^self dayOfWeek
+!
+
+dayOfWeek
+	<return self.getDay() + 1>
+!
+
+dayOfWeek: aNumber
+	<return self.setDay(aNumber - 1)>
+!
+
+day: aNumber
+	self day: aNumber
+!
+
+year: aNumber
+	<self.setFullYear(aNumber)>
+!
+
+dayOfMonth
+	<return self.getDate()>
+!
+
+dayOfMonth: aNumber
+	<self.setDate(aNumber)>
+!
+
+time
+	<return self.getTime()>
+!
+
+time: aNumber
+	<self.setTime(aNumber)>
+!
+
+hours: aNumber
+	<self.setHours(aNumber)>
+!
+
+minutes: aNumber
+	<self.setMinutes(aNumber)>
+!
+
+seconds: aNumber
+	<self.setSeconds(aNumber)>
+!
+
+milliseconds: aNumber
+	<self.setMilliseconds(aNumber)>
+!
+
+hours
+	<return self.getHours()>
+!
+
+minutes
+	<return self.getMinutes()>
+!
+
+seconds
+	<return self.getSeconds()>
+!
+
+milliseconds
+	<return self.getMilliseconds()>
+! !
+
+!Date methodsFor: 'arithmetic'!
+
+- aDate
+	<return self - aDate>
+!
+
++ aDate
+	<return self + aDate>
+! !
+
+!Date methodsFor: 'comparing'!
+
+< aDate
+	<return self < aDate>
+!
+
+> aDate
+	<return self >> aDate>
+!
+
+<= aDate
+	<return self <= aDate>
+!
+
+>= aDate
+	<return self >>= aDate>
+! !
+
+!Date methodsFor: 'converting'!
+
+asString
+	<return self.toString()>
+!
+
+asMilliseconds
+	^self time
+!
+
+asDateString
+	<return self.toDateString()>
+!
+
+asTimeString
+	<return self.toTimeString()>
+!
+
+asLocaleString
+	<return self.toLocaleString()>
+!
+
+asNumber
+	^self asMilliseconds
+! !
+
+!Date methodsFor: 'printing'!
+
+printString
+	^self asString
+! !
+
+!Date class methodsFor: 'instance creation'!
+
+new: anObject
+	<return new Date(anObject)>
+!
+
+fromString: aString
+	"Example: Date fromString('2011/04/15 00:00:00')"
+	^self new: aString
+!
+
+fromSeconds: aNumber
+	^self fromMilliseconds: aNumber * 1000
+!
+
+fromMilliseconds: aNumber
+	^self new: aNumber
+!
+
+today
+	^self new
+!
+
+now
+	^self today
+!
+
+millisecondsToRun: aBlock
+	| t |
+	t := Date now.
+	aBlock value.
+	^Date now - t
+! !
+
 Object subclass: #JSObjectProxy
 	instanceVariableNames: 'jsObject'
 	category: 'Kernel-Objects'!

Some files were not shown because too many files changed in this diff