Nicolas Petton 12 gadi atpakaļ
vecāks
revīzija
8667af4a46
11 mainītis faili ar 948 papildinājumiem un 416 dzēšanām
  1. 2 17
      _layouts/default.html
  2. 115 57
      js/Canvas.js
  3. 18 2
      js/Compiler.js
  4. 9 1
      js/Examples.js
  5. 166 243
      js/IDE.js
  6. 64 18
      js/JQuery.js
  7. 401 35
      js/Kernel.js
  8. 17 0
      js/Parser.js
  9. 35 11
      js/SUnit.js
  10. 121 30
      js/boot.js
  11. 0 2
      js/init.js

+ 2 - 17
_layouts/default.html

@@ -6,23 +6,8 @@
     <meta name="author" content="Nicolas Petton" />
     <link rel="stylesheet" type="text/css" href='css/style.css' />
     <link rel="stylesheet" type="text/css" href='css/syntax.css' />
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/jquery-1.4.4.min.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/jquery-ui-1.8.9.custom.min.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/jquery.textarea.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/boot.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/Kernel.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/Canvas.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/JQuery.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/Parser.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/Compiler.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/IDE.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/SUnit.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/Examples.js'></script>
-    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/init.js'></script>
-
-    <link rel="stylesheet" type="text/css" href="css/jtalk.css"/>
-    <link rel="stylesheet" type="text/css" href="css/sunit.css"/>
-
+    <script type='text/javascript' src='https://raw.github.com/NicolasPetton/jtalk/master/js/jtalkjs'></script>
+    <script type='text/javascript'> loadJtalk() </script>
     <script type="text/javascript">
 
       var _gaq = _gaq || [];

+ 115 - 57
js/Canvas.js

@@ -226,6 +226,7 @@ referencedClasses: []
 smalltalk.CanvasRenderingContext.klass);
 
 
+smalltalk.setup(smalltalk.CanvasRenderingContext);
 smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
 '_root_',
@@ -265,11 +266,11 @@ category: 'initialization',
 fn: function (){
 var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
-self['@root']=smalltalk.send(smalltalk.TagBrush, "_fromString_canvas_", ["div", self]);
+smalltalk.send(self['@root'], "_ifNil_", [(function(){return self['@root']=smalltalk.send(smalltalk.TagBrush, "_fromString_canvas_", ["div", self]);})]);
 return self;},
-source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self'),
-messageSends: ["initialize", "fromString:canvas:"],
-referencedClasses: [smalltalk.TagBrush]
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20ifNil%3A%20%5Broot%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self%5D'),
+messageSends: ["initialize", "ifNil:", "fromString:canvas:"],
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.HTMLCanvas);
 
@@ -299,7 +300,7 @@ return smalltalk.send(smalltalk.TagBrush, "_fromString_canvas_", [aString, self]
 return self;},
 source: unescape('newTag%3A%20aString%0A%20%20%20%20%5ETagBrush%20fromString%3A%20aString%20canvas%3A%20self'),
 messageSends: ["fromString:canvas:"],
-referencedClasses: [smalltalk.TagBrush]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.HTMLCanvas);
 
@@ -693,8 +694,84 @@ referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
+smalltalk.addMethod(
+'_initializeFromJQuery_',
+smalltalk.method({
+selector: 'initializeFromJQuery:',
+category: 'initialization',
+fn: function (aJQuery){
+var self=this;
+self['@root']=smalltalk.send(smalltalk.TagBrush, "_fromJQuery_canvas_", [aJQuery, self]);
+return self;},
+source: unescape('initializeFromJQuery%3A%20aJQuery%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromJQuery%3A%20aJQuery%20canvas%3A%20self'),
+messageSends: ["fromJQuery:canvas:"],
+referencedClasses: [smalltalk.nil]
+}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_pre',
+smalltalk.method({
+selector: 'pre',
+category: 'tags',
+fn: function (){
+var self=this;
+return smalltalk.send(self, "_tag_", ["pre"]);
+return self;},
+source: unescape('pre%0A%20%20%20%20%5Eself%20tag%3A%20%27pre%27'),
+messageSends: ["tag:"],
+referencedClasses: []
+}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_code',
+smalltalk.method({
+selector: 'code',
+category: 'tags',
+fn: function (){
+var self=this;
+return smalltalk.send(self, "_tag_", ["code"]);
+return self;},
+source: unescape('code%0A%20%20%20%20%5Eself%20tag%3A%20%27code%27'),
+messageSends: ["tag:"],
+referencedClasses: []
+}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_br',
+smalltalk.method({
+selector: 'br',
+category: 'tags',
+fn: function (){
+var self=this;
+return smalltalk.send(self, "_tag_", ["br"]);
+return self;},
+source: unescape('br%0A%20%20%20%20%5Eself%20tag%3A%20%27br%27'),
+messageSends: ["tag:"],
+referencedClasses: []
+}),
+smalltalk.HTMLCanvas);
 
 
+smalltalk.addMethod(
+'_onJQuery_',
+smalltalk.method({
+selector: 'onJQuery:',
+category: 'instance creation',
+fn: function (aJQuery){
+var self=this;
+return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_", [aJQuery]);smalltalk.send($rec, "_initialize", []);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_basicNew", []));
+return self;},
+source: unescape('onJQuery%3A%20aJQuery%0A%09%5Eself%20basicNew%0A%09%09initializeFromJQuery%3A%20aJQuery%3B%0A%09%09initialize%3B%0A%09%09yourself'),
+messageSends: ["initializeFromJQuery:", "initialize", "yourself", "basicNew"],
+referencedClasses: []
+}),
+smalltalk.HTMLCanvas.klass);
+
+
+smalltalk.setup(smalltalk.HTMLCanvas);
 smalltalk.addClass('TagBrush', smalltalk.Object, ['canvas', 'element'], 'Canvas');
 smalltalk.addMethod(
 '_contents_',
@@ -1138,6 +1215,22 @@ referencedClasses: []
 }),
 smalltalk.TagBrush);
 
+smalltalk.addMethod(
+'_initializeFromJQuery_canvas_',
+smalltalk.method({
+selector: 'initializeFromJQuery:canvas:',
+category: 'initialization',
+fn: function (aJQuery, aCanvas){
+var self=this;
+self['@element']=smalltalk.send(smalltalk.send(aJQuery, "_jquery", []), "_get_", [(0)]);
+self['@canvas']=aCanvas;
+return self;},
+source: unescape('initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20aJQuery%20jquery%20get%3A%200.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas'),
+messageSends: ["get:", "jquery"],
+referencedClasses: []
+}),
+smalltalk.TagBrush);
+
 
 smalltalk.addMethod(
 '_fromString_canvas_',
@@ -1154,23 +1247,24 @@ referencedClasses: []
 }),
 smalltalk.TagBrush.klass);
 
-
-smalltalk.addClass('Widget', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
-'_root',
+'_fromJQuery_canvas_',
 smalltalk.method({
-selector: 'root',
-category: 'accessing',
-fn: function (){
+selector: 'fromJQuery:canvas:',
+category: 'instance creation',
+fn: function (aJQuery, aCanvas){
 var self=this;
-return self['@root'];
+return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_canvas_", [aJQuery, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-source: unescape('root%0A%20%20%20%20%5Eroot'),
-messageSends: [],
+source: unescape('fromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%3B%0A%09yourself'),
+messageSends: ["initializeFromJQuery:canvas:", "yourself", "new"],
 referencedClasses: []
 }),
-smalltalk.Widget);
+smalltalk.TagBrush.klass);
 
+
+smalltalk.setup(smalltalk.TagBrush);
+smalltalk.addClass('Widget', smalltalk.Object, [], 'Canvas');
 smalltalk.addMethod(
 '_appendToBrush_',
 smalltalk.method({
@@ -1193,12 +1287,11 @@ selector: 'appendToJQuery:',
 category: 'adding',
 fn: function (aJQuery){
 var self=this;
-smalltalk.send(self, "_render", []);
-smalltalk.send(aJQuery, "_append_", [smalltalk.send(smalltalk.send(self, "_root", []), "_asJQuery", [])]);
+smalltalk.send(self, "_renderOn_", [smalltalk.send(smalltalk.HTMLCanvas, "_onJQuery_", [aJQuery])]);
 return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20self%20render.%0A%20%20%20%20aJQuery%20append%3A%20self%20root%20asJQuery'),
-messageSends: ["render", "append:", "asJQuery", "root"],
-referencedClasses: []
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20self%20renderOn%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
+messageSends: ["renderOn:", "onJQuery:"],
+referencedClasses: [smalltalk.HTMLCanvas]
 }),
 smalltalk.Widget);
 
@@ -1262,43 +1355,6 @@ referencedClasses: []
 }),
 smalltalk.Widget);
 
-smalltalk.addMethod(
-'_update',
-smalltalk.method({
-selector: 'update',
-category: 'actions',
-fn: function (){
-var self=this;
-var canvas=nil;
-canvas=smalltalk.send(smalltalk.HTMLCanvas, "_new", []);
-smalltalk.send(canvas, "_root_", [smalltalk.send(self, "_root", [])]);
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_root", []), "_asJQuery", []), "_empty", []);
-smalltalk.send(self, "_renderOn_", [canvas]);
-return self;},
-source: unescape('update%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20canvas%20root%3A%20self%20root.%0A%20%20%20%20self%20root%20asJQuery%20empty.%0A%20%20%20%20self%20renderOn%3A%20canvas'),
-messageSends: ["new", "root:", "root", "empty", "asJQuery", "renderOn:"],
-referencedClasses: [smalltalk.HTMLCanvas]
-}),
-smalltalk.Widget);
-
-smalltalk.addMethod(
-'_render',
-smalltalk.method({
-selector: 'render',
-category: 'rendering',
-fn: function (){
-var self=this;
-var canvas=nil;
-canvas=smalltalk.send(smalltalk.HTMLCanvas, "_new", []);
-self['@root']=smalltalk.send(canvas, "_root", []);
-smalltalk.send(self, "_renderOn_", [canvas]);
-return self;},
-source: unescape('render%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20self%20renderOn%3A%20canvas'),
-messageSends: ["new", "root", "renderOn:"],
-referencedClasses: [smalltalk.HTMLCanvas]
-}),
-smalltalk.Widget);
-
 smalltalk.addMethod(
 '_renderOn_',
 smalltalk.method({
@@ -1316,6 +1372,7 @@ smalltalk.Widget);
 
 
 
+smalltalk.setup(smalltalk.Widget);
 smalltalk.addClass('CanvasBrush', smalltalk.TagBrush, [], 'Canvas');
 smalltalk.addMethod(
 '_createElement',
@@ -1364,6 +1421,7 @@ referencedClasses: []
 smalltalk.CanvasBrush.klass);
 
 
+smalltalk.setup(smalltalk.CanvasBrush);
 smalltalk.addMethod(
 '_appendToBrush_',
 smalltalk.method({

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 18 - 2
js/Compiler.js


+ 9 - 1
js/Examples.js

@@ -66,6 +66,7 @@ smalltalk.Counter);
 
 
 
+smalltalk.setup(smalltalk.Counter);
 smalltalk.addClass('Tetris', smalltalk.Widget, ['renderingContext', 'timer', 'speed', 'score', 'rows', 'movingPiece'], 'Examples');
 smalltalk.addMethod(
 '_width',
@@ -271,7 +272,7 @@ self['@movingPiece']=smalltalk.send(smalltalk.TetrisPiece, "_atRandom", []);
 return self;},
 source: unescape('newPiece%0A%09movingPiece%20%3A%3D%20TetrisPiece%20atRandom'),
 messageSends: ["atRandom"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Tetris);
 
@@ -434,6 +435,7 @@ referencedClasses: []
 smalltalk.Tetris.klass);
 
 
+smalltalk.setup(smalltalk.Tetris);
 smalltalk.addClass('TetrisPiece', smalltalk.Widget, ['rotation', 'position'], 'Examples');
 smalltalk.addMethod(
 '_rotation',
@@ -603,6 +605,7 @@ referencedClasses: []
 smalltalk.TetrisPiece.klass);
 
 
+smalltalk.setup(smalltalk.TetrisPiece);
 smalltalk.addClass('TetrisPieceO', smalltalk.TetrisPiece, [], 'Examples');
 smalltalk.addMethod(
 '_bounds',
@@ -621,6 +624,7 @@ smalltalk.TetrisPieceO);
 
 
 
+smalltalk.setup(smalltalk.TetrisPieceO);
 smalltalk.addClass('TetrisPieceL', smalltalk.TetrisPiece, [], 'Examples');
 smalltalk.addMethod(
 '_bounds',
@@ -669,6 +673,7 @@ smalltalk.TetrisPieceL);
 
 
 
+smalltalk.setup(smalltalk.TetrisPieceL);
 smalltalk.addClass('TetrisPieceJ', smalltalk.TetrisPiece, [], 'Examples');
 smalltalk.addMethod(
 '_color',
@@ -717,6 +722,7 @@ smalltalk.TetrisPieceJ);
 
 
 
+smalltalk.setup(smalltalk.TetrisPieceJ);
 smalltalk.addClass('TetrisPieceI', smalltalk.TetrisPiece, [], 'Examples');
 smalltalk.addMethod(
 '_color',
@@ -765,6 +771,7 @@ smalltalk.TetrisPieceI);
 
 
 
+smalltalk.setup(smalltalk.TetrisPieceI);
 smalltalk.addClass('TetrisPieceT', smalltalk.TetrisPiece, [], 'Examples');
 smalltalk.addMethod(
 '_bounds',
@@ -798,3 +805,4 @@ smalltalk.TetrisPieceT);
 
 
 
+smalltalk.setup(smalltalk.TetrisPieceT);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 166 - 243
js/IDE.js


+ 64 - 18
js/JQuery.js

@@ -75,6 +75,21 @@ referencedClasses: []
 }),
 smalltalk.JQuery);
 
+smalltalk.addMethod(
+'_jquery',
+smalltalk.method({
+selector: 'jquery',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@jquery'];
+return self;},
+source: unescape('jquery%0A%09%5Ejquery'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JQuery);
+
 smalltalk.addMethod(
 '_removeAttribute_',
 smalltalk.method({
@@ -144,7 +159,7 @@ fn: function (aString){
 var self=this;
 return self['@jquery'].css(aString);
 return self;},
-source: unescape('cssAt%3A%20aString%0A%09%7B%27return%20self%5B%27%27@jquery%27%27%5D.css%28aString%29%27%7D'),
+source: unescape('cssAt%3A%20aString%0A%09%3Creturn%20self%5B%27@jquery%27%5D.css%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -159,7 +174,7 @@ fn: function (aString, anotherString){
 var self=this;
 self['@jquery'].css(aString, anotherString);
 return self;},
-source: unescape('cssAt%3A%20aString%20put%3A%20anotherString%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.css%28aString%2C%20anotherString%29%27%7D'),
+source: unescape('cssAt%3A%20aString%20put%3A%20anotherString%0A%20%20%20%20%3Cself%5B%27@jquery%27%5D.css%28aString%2C%20anotherString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -519,7 +534,7 @@ fn: function (anEventString, aBlock){
 var self=this;
 self['@jquery'].bind(anEventString, function(e){aBlock(e, self)});
 return self;},
-source: unescape('on%3A%20anEventString%20do%3A%20aBlock%0A%20%20%20%20%22Attach%20aBlock%20for%20anEventString%20on%20the%20element%22%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.bind%28anEventString%2C%20function%28e%29%7BaBlock%28e%2C%20self%29%7D%29%27%7D'),
+source: unescape('on%3A%20anEventString%20do%3A%20aBlock%0A%20%20%20%20%22Attach%20aBlock%20for%20anEventString%20on%20the%20element%22%0A%20%20%20%20%3Cself%5B%27@jquery%27%5D.bind%28anEventString%2C%20function%28e%29%7BaBlock%28e%2C%20self%29%7D%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -564,7 +579,7 @@ fn: function (aString){
 var self=this;
 return self['@jquery'][aString]();
 return self;},
-source: unescape('call%3A%20aString%0A%09%7B%27return%20self%5B%27%27@jquery%27%27%5D%5BaString%5D%28%29%27%7D'),
+source: unescape('call%3A%20aString%0A%09%3Creturn%20self%5B%27@jquery%27%5D%5BaString%5D%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -579,7 +594,7 @@ fn: function (aString, anObject){
 var self=this;
 return self['@jquery'][aString](anObject);
 return self;},
-source: unescape('call%3A%20aString%20withArgument%3A%20anObject%0A%20%20%20%20%7B%27return%20self%5B%27%27@jquery%27%27%5D%5BaString%5D%28anObject%29%27%7D'),
+source: unescape('call%3A%20aString%20withArgument%3A%20anObject%0A%20%20%20%20%3Creturn%20self%5B%27@jquery%27%5D%5BaString%5D%28anObject%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -612,7 +627,7 @@ var newJQuery=nil;
 newJQuery = jQuery(String(aString));
 return smalltalk.send(self, "_from_", [newJQuery]);
 return self;},
-source: unescape('fromString%3A%20aString%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%7B%27newJQuery%20%3D%20jQuery%28String%28aString%29%29%27%7D.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery'),
+source: unescape('fromString%3A%20aString%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%3CnewJQuery%20%3D%20jQuery%28String%28aString%29%29%3E.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery'),
 messageSends: ["from:"],
 referencedClasses: []
 }),
@@ -642,7 +657,7 @@ fn: function (){
 var self=this;
 return self._from_(jQuery(window));
 return self;},
-source: unescape('window%0A%09%7B%27return%20self._from_%28jQuery%28window%29%29%27%7D'),
+source: unescape('window%0A%09%3Creturn%20self._from_%28jQuery%28window%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -655,9 +670,9 @@ selector: 'body',
 category: 'instance creation',
 fn: function (){
 var self=this;
-return self._from_(jQuery(body));
+return self._from_(jQuery('body'));
 return self;},
-source: unescape('body%0A%09%7B%27return%20self._from_%28jQuery%28body%29%29%27%7D'),
+source: unescape('body%0A%09%3Creturn%20self._from_%28jQuery%28%27body%27%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -672,13 +687,46 @@ fn: function (){
 var self=this;
 return self._from_(jQuery(document));
 return self;},
-source: unescape('document%0A%09%7B%27return%20self._from_%28jQuery%28document%29%29%27%7D'),
+source: unescape('document%0A%09%3Creturn%20self._from_%28jQuery%28document%29%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JQuery.klass);
+
+smalltalk.addMethod(
+'_fromElement_',
+smalltalk.method({
+selector: 'fromElement:',
+category: 'instance creation',
+fn: function (anElement){
+var self=this;
+var newJQuery=nil;
+newJQuery = jQuery(anElement);
+return smalltalk.send(self, "_from_", [newJQuery]);
+return self;},
+source: unescape('fromElement%3A%20anElement%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%3CnewJQuery%20%3D%20jQuery%28anElement%29%3E.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery'),
+messageSends: ["from:"],
+referencedClasses: []
+}),
+smalltalk.JQuery.klass);
+
+smalltalk.addMethod(
+'_documentReady_',
+smalltalk.method({
+selector: 'documentReady:',
+category: 'instance creation',
+fn: function (aBlock){
+var self=this;
+jQuery(document).ready(aBlock);
+return self;},
+source: unescape('documentReady%3A%20aBlock%0A%09%3CjQuery%28document%29.ready%28aBlock%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.JQuery.klass);
 
 
+smalltalk.setup(smalltalk.JQuery);
 smalltalk.addClass('Ajax', smalltalk.Object, ['settings'], 'JQuery');
 smalltalk.Ajax.comment=unescape('instance%20variable%20names%3A%0A-%20settings%20%20A%20set%20of%20key/value%20pairs%20that%20configure%20the%20Ajax%20request.%20All%20settings%20are%20optional.%0A%0AFull%20list%20of%20settings%20options%20at%20http%3A//api.jquery.com/jQuery.ajax/')
 smalltalk.addMethod(
@@ -750,7 +798,7 @@ fn: function (){
 var self=this;
 jQuery.ajax(self['@settings']);
 return self;},
-source: unescape('send%0A%20%20%20%20%7B%27jQuery.ajax%28self%5B%27%27@settings%27%27%5D%29%27%7D'),
+source: unescape('send%0A%20%20%20%20%3CjQuery.ajax%28self%5B%27@settings%27%5D%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -789,6 +837,7 @@ referencedClasses: []
 smalltalk.Ajax.klass);
 
 
+smalltalk.setup(smalltalk.Ajax);
 smalltalk.addMethod(
 '_appendToJQuery_',
 smalltalk.method({
@@ -796,13 +845,10 @@ selector: 'appendToJQuery:',
 category: '*JQuery',
 fn: function (aJQuery){
 var self=this;
-var canvas=nil;
-canvas=smalltalk.send(smalltalk.HTMLCanvas, "_new", []);
-smalltalk.send(self, "_value_", [canvas]);
-smalltalk.send(aJQuery, "_append_", [canvas]);
+smalltalk.send(self, "_value_", [smalltalk.send(smalltalk.HTMLCanvas, "_onJQuery_", [aJQuery])]);
 return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%09%7C%20canvas%20%7C%0A%09canvas%20%3A%3D%20HTMLCanvas%20new.%0A%09self%20value%3A%20canvas.%0A%09aJQuery%20append%3A%20canvas'),
-messageSends: ["new", "value:", "append:"],
+source: unescape('appendToJQuery%3A%20aJQuery%0A%09self%20value%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
+messageSends: ["value:", "onJQuery:"],
 referencedClasses: [smalltalk.HTMLCanvas]
 }),
 smalltalk.BlockClosure);
@@ -831,7 +877,7 @@ fn: function (aJQuery){
 var self=this;
 aJQuery._appendElement_(String(self));
 return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20%7B%27aJQuery._appendElement_%28String%28self%29%29%27%7D'),
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20%3CaJQuery._appendElement_%28String%28self%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),

+ 401 - 35
js/Kernel.js

@@ -678,6 +678,21 @@ referencedClasses: [smalltalk.Object]
 }),
 smalltalk.Object);
 
+smalltalk.addMethod(
+'_halt',
+smalltalk.method({
+selector: 'halt',
+category: 'error handling',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_error_", ["Halt encountered"]);
+return self;},
+source: unescape('halt%0A%09self%20error%3A%20%27Halt%20encountered%27'),
+messageSends: ["error:"],
+referencedClasses: []
+}),
+smalltalk.Object);
+
 
 smalltalk.addMethod(
 '_initialize',
@@ -695,6 +710,7 @@ referencedClasses: []
 smalltalk.Object.klass);
 
 
+smalltalk.setup(smalltalk.Object);
 smalltalk.addClass('Smalltalk', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_classes',
@@ -711,36 +727,6 @@ referencedClasses: []
 }),
 smalltalk.Smalltalk);
 
-smalltalk.addMethod(
-'_debugMode',
-smalltalk.method({
-selector: 'debugMode',
-category: 'accessing',
-fn: function (){
-var self=this;
-return self.debugMode;
-return self;},
-source: unescape('debugMode%0A%09%3Creturn%20self.debugMode%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Smalltalk);
-
-smalltalk.addMethod(
-'_debugMode_',
-smalltalk.method({
-selector: 'debugMode:',
-category: 'accessing',
-fn: function (aBoolean){
-var self=this;
-self.debugMode = aBoolean;
-return self;},
-source: unescape('debugMode%3A%20aBoolean%0A%09%3Cself.debugMode%20%3D%20aBoolean%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Smalltalk);
-
 smalltalk.addMethod(
 '_readJSON_',
 smalltalk.method({
@@ -771,6 +757,24 @@ referencedClasses: []
 }),
 smalltalk.Smalltalk);
 
+smalltalk.addMethod(
+'_removeClass_',
+smalltalk.method({
+selector: 'removeClass:',
+category: 'accessing',
+fn: function (aClass){
+var self=this;
+smalltalk.send(smalltalk.send(aClass, "_isMetaclass", []), "_ifTrue_", [(function(){return smalltalk.send(self, "_error_", [smalltalk.send(smalltalk.send(aClass, "_asString", []), "__comma", [unescape("%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21")])]);})]);
+smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_methodDictionary", []), "_values", []), "_do_", [(function(each){return smalltalk.send(aClass, "_removeCompiledMethod_", [each]);})]);
+smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aClass, "_class", []), "_methodDictionary", []), "_values", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(aClass, "_class", []), "_removeCompiledMethod_", [each]);})]);
+smalltalk.send(self, "_basicDelete_", [smalltalk.send(aClass, "_name", [])]);
+return self;},
+source: unescape('removeClass%3A%20aClass%0A%09aClass%20isMetaclass%20ifTrue%3A%20%5Bself%20error%3A%20aClass%20asString%2C%20%27%20is%20a%20Metaclass%20and%20cannot%20be%20removed%21%27%5D.%0A%09aClass%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aClass%20removeCompiledMethod%3A%20each%5D.%0A%09aClass%20class%20methodDictionary%20values%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aClass%20class%20removeCompiledMethod%3A%20each%5D.%0A%09self%20basicDelete%3A%20aClass%20name'),
+messageSends: ["ifTrue:", "isMetaclass", "error:", unescape("%2C"), "asString", "do:", "values", "methodDictionary", "removeCompiledMethod:", "class", "basicDelete:", "name"],
+referencedClasses: []
+}),
+smalltalk.Smalltalk);
+
 
 smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
@@ -789,6 +793,7 @@ referencedClasses: []
 smalltalk.Smalltalk.klass);
 
 
+smalltalk.setup(smalltalk.Smalltalk);
 smalltalk.addClass('Behavior', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_new',
@@ -1034,8 +1039,9 @@ fn: function (aMethod){
 var self=this;
 delete self.fn.prototype[aMethod.selector._asSelector()];
 	delete self.fn.prototype.methods[aMethod.selector];
+	smalltalk.init(self);;
 return self;},
-source: unescape('removeCompiledMethod%3A%20aMethod%0A%09%3Cdelete%20self.fn.prototype%5BaMethod.selector._asSelector%28%29%5D%3B%0A%09delete%20self.fn.prototype.methods%5BaMethod.selector%5D%3E'),
+source: unescape('removeCompiledMethod%3A%20aMethod%0A%09%3Cdelete%20self.fn.prototype%5BaMethod.selector._asSelector%28%29%5D%3B%0A%09delete%20self.fn.prototype.methods%5BaMethod.selector%5D%3B%0A%09smalltalk.init%28self%29%3B%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1092,8 +1098,42 @@ referencedClasses: [smalltalk.nil,smalltalk.Array]
 }),
 smalltalk.Behavior);
 
+smalltalk.addMethod(
+'_allInstanceVariableNames',
+smalltalk.method({
+selector: 'allInstanceVariableNames',
+category: 'accessing',
+fn: function (){
+var self=this;
+var result=nil;
+result=smalltalk.send(smalltalk.send(self, "_instanceVariableNames", []), "_copy", []);
+smalltalk.send(smalltalk.send(self, "_superclass", []), "_ifNotNil_", [(function(){return smalltalk.send(result, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allInstanceVariableNames", [])]);})]);
+return result;
+return self;},
+source: unescape('allInstanceVariableNames%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20self%20instanceVariableNames%20copy.%0A%09self%20superclass%20ifNotNil%3A%20%5B%0A%09%20%20%20%20result%20addAll%3A%20self%20superclass%20allInstanceVariableNames%5D.%0A%09%5Eresult'),
+messageSends: ["copy", "instanceVariableNames", "ifNotNil:", "superclass", "addAll:", "allInstanceVariableNames"],
+referencedClasses: []
+}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_methodAt_',
+smalltalk.method({
+selector: 'methodAt:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.methods(self)[aString];
+return self;},
+source: unescape('methodAt%3A%20aString%0A%09%3Creturn%20smalltalk.methods%28self%29%5BaString%5D%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Behavior);
+
 
 
+smalltalk.setup(smalltalk.Behavior);
 smalltalk.addClass('Class', smalltalk.Behavior, [], 'Kernel');
 smalltalk.addMethod(
 '_category',
@@ -1206,6 +1246,7 @@ smalltalk.Class);
 
 
 
+smalltalk.setup(smalltalk.Class);
 smalltalk.addClass('Metaclass', smalltalk.Behavior, [], 'Kernel');
 smalltalk.addMethod(
 '_instanceClass',
@@ -1269,6 +1310,7 @@ smalltalk.Metaclass);
 
 
 
+smalltalk.setup(smalltalk.Metaclass);
 smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_source',
@@ -1437,6 +1479,7 @@ smalltalk.CompiledMethod);
 
 
 
+smalltalk.setup(smalltalk.CompiledMethod);
 smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '__eq',
@@ -1859,6 +1902,7 @@ referencedClasses: []
 smalltalk.Number.klass);
 
 
+smalltalk.setup(smalltalk.Number);
 smalltalk.addClass('BlockClosure', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_compiledSource',
@@ -2027,6 +2071,7 @@ smalltalk.BlockClosure);
 
 
 
+smalltalk.setup(smalltalk.BlockClosure);
 smalltalk.addClass('Boolean', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '__eq',
@@ -2216,6 +2261,7 @@ smalltalk.Boolean);
 
 
 
+smalltalk.setup(smalltalk.Boolean);
 smalltalk.addClass('Date', smalltalk.Object, [], 'Kernel');
 smalltalk.Date.comment=unescape('The%20Date%20class%20is%20used%20to%20work%20with%20dates%20and%20times.')
 smalltalk.addMethod(
@@ -2838,6 +2884,7 @@ referencedClasses: [smalltalk.Date]
 smalltalk.Date.klass);
 
 
+smalltalk.setup(smalltalk.Date);
 smalltalk.addClass('UndefinedObject', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_subclass_instanceVariableNames_',
@@ -3021,6 +3068,7 @@ referencedClasses: []
 smalltalk.UndefinedObject.klass);
 
 
+smalltalk.setup(smalltalk.UndefinedObject);
 smalltalk.addClass('Collection', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_size',
@@ -3487,6 +3535,7 @@ referencedClasses: []
 smalltalk.Collection.klass);
 
 
+smalltalk.setup(smalltalk.Collection);
 smalltalk.addClass('SequenceableCollection', smalltalk.Collection, [], 'Kernel');
 smalltalk.addMethod(
 '_at_',
@@ -3735,6 +3784,7 @@ smalltalk.SequenceableCollection);
 
 
 
+smalltalk.setup(smalltalk.SequenceableCollection);
 smalltalk.addClass('String', smalltalk.SequenceableCollection, [], 'Kernel');
 smalltalk.addMethod(
 '__eq',
@@ -4338,6 +4388,36 @@ referencedClasses: []
 }),
 smalltalk.String);
 
+smalltalk.addMethod(
+'_asLowercase',
+smalltalk.method({
+selector: 'asLowercase',
+category: 'converting',
+fn: function (){
+var self=this;
+return self.toLowerCase();
+return self;},
+source: unescape('asLowercase%0A%09%3Creturn%20self.toLowerCase%28%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asUppercase',
+smalltalk.method({
+selector: 'asUppercase',
+category: 'converting',
+fn: function (){
+var self=this;
+return self.toUpperCase();
+return self;},
+source: unescape('asUppercase%0A%09%3Creturn%20self.toUpperCase%28%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.String);
+
 
 smalltalk.addMethod(
 '_streamClass',
@@ -4445,6 +4525,7 @@ referencedClasses: []
 smalltalk.String.klass);
 
 
+smalltalk.setup(smalltalk.String);
 smalltalk.addClass('Array', smalltalk.SequenceableCollection, [], 'Kernel');
 smalltalk.addMethod(
 '_size',
@@ -4713,8 +4794,29 @@ referencedClasses: []
 }),
 smalltalk.Array);
 
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'enumerating',
+fn: function (){
+var self=this;
+var str=nil;
+str=smalltalk.send("", "_writeStream", []);
+smalltalk.send(str, "_nextPutAll_", [smalltalk.send(smalltalk.send(self, "_printString", [], smalltalk.SequenceableCollection), "__comma", [unescape("%20%28")])]);
+smalltalk.send(self, "_do_separatedBy_", [(function(each){return smalltalk.send(str, "_nextPutAll_", [smalltalk.send(each, "_printString", [])]);}), (function(){return smalltalk.send(str, "_nextPutAll_", [" "]);})]);
+smalltalk.send(str, "_nextPutAll_", [unescape("%29")]);
+return smalltalk.send(str, "_contents", []);
+return self;},
+source: unescape('printString%0A%09%7C%20str%20%7C%0A%09str%20%3A%3D%20%27%27%20writeStream.%0A%09str%20nextPutAll%3A%20super%20printString%2C%20%27%20%28%27.%0A%09self%20%0A%09%09do%3A%20%5B%3Aeach%20%7C%20str%20nextPutAll%3A%20each%20printString%5D%0A%09%09separatedBy%3A%20%5Bstr%20nextPutAll%3A%20%27%20%27%5D.%0A%09str%20nextPutAll%3A%20%27%29%27.%0A%09%5Estr%20contents'),
+messageSends: ["writeStream", "nextPutAll:", unescape("%2C"), "printString", "do:separatedBy:", "contents"],
+referencedClasses: []
+}),
+smalltalk.Array);
 
 
+
+smalltalk.setup(smalltalk.Array);
 smalltalk.addClass('RegularExpression', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_compile_',
@@ -4738,9 +4840,9 @@ selector: 'exec:',
 category: 'evaluating',
 fn: function (aString){
 var self=this;
-return self.exec(aString);
+return self.exec(aString) || nil;
 return self;},
-source: unescape('exec%3A%20aString%0A%09%3Creturn%20self.exec%28aString%29%3E'),
+source: unescape('exec%3A%20aString%0A%09%3Creturn%20self.exec%28aString%29%20%7C%7C%20nil%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -4793,6 +4895,7 @@ referencedClasses: []
 smalltalk.RegularExpression.klass);
 
 
+smalltalk.setup(smalltalk.RegularExpression);
 smalltalk.addClass('Error', smalltalk.Object, ['messageText'], 'Kernel');
 smalltalk.addMethod(
 '_messageText',
@@ -4831,9 +4934,24 @@ selector: 'signal',
 category: 'signaling',
 fn: function (){
 var self=this;
-console.log(self._messageText()); throw(self);
+self.context = thisContext; self.smalltalkError = true; throw(self);
+return self;},
+source: unescape('signal%0A%09%3Cself.context%20%3D%20thisContext%3B%20self.smalltalkError%20%3D%20true%3B%20throw%28self%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Error);
+
+smalltalk.addMethod(
+'_context',
+smalltalk.method({
+selector: 'context',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.context;
 return self;},
-source: unescape('signal%0A%09%3Cconsole.log%28self._messageText%28%29%29%3B%20throw%28self%29%3E'),
+source: unescape('context%0A%09%3Creturn%20self.context%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -4856,6 +4974,101 @@ referencedClasses: []
 smalltalk.Error.klass);
 
 
+smalltalk.setup(smalltalk.Error);
+smalltalk.addClass('MethodContext', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_receiver',
+smalltalk.method({
+selector: 'receiver',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.receiver;
+return self;},
+source: unescape('receiver%0A%09%3Creturn%20self.receiver%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.MethodContext);
+
+smalltalk.addMethod(
+'_selector',
+smalltalk.method({
+selector: 'selector',
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.convertSelector(self.selector);
+return self;},
+source: unescape('selector%0A%09%3Creturn%20smalltalk.convertSelector%28self.selector%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.MethodContext);
+
+smalltalk.addMethod(
+'_home',
+smalltalk.method({
+selector: 'home',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.homeContext;
+return self;},
+source: unescape('home%0A%09%3Creturn%20self.homeContext%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.MethodContext);
+
+smalltalk.addMethod(
+'_temps',
+smalltalk.method({
+selector: 'temps',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.temps;
+return self;},
+source: unescape('temps%0A%09%3Creturn%20self.temps%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.MethodContext);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+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;},
+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.MethodContext);
+
+smalltalk.addMethod(
+'_asString',
+smalltalk.method({
+selector: 'asString',
+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;},
+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.MethodContext);
+
+
+
+smalltalk.setup(smalltalk.MethodContext);
 smalltalk.addClass('Association', smalltalk.Object, ['key', 'value'], 'Kernel');
 smalltalk.addMethod(
 '__eq',
@@ -4949,6 +5162,7 @@ referencedClasses: []
 smalltalk.Association.klass);
 
 
+smalltalk.setup(smalltalk.Association);
 smalltalk.addClass('Dictionary', smalltalk.Collection, ['keys'], 'Kernel');
 smalltalk.addMethod(
 '__eq',
@@ -5378,6 +5592,7 @@ smalltalk.Dictionary);
 
 
 
+smalltalk.setup(smalltalk.Dictionary);
 smalltalk.addClass('ClassBuilder', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_superclass_subclass_',
@@ -5477,6 +5692,7 @@ smalltalk.ClassBuilder);
 
 
 
+smalltalk.setup(smalltalk.ClassBuilder);
 smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel');
 smalltalk.addMethod(
 '_initialize',
@@ -5547,6 +5763,7 @@ smalltalk.ClassCategoryReader);
 
 
 
+smalltalk.setup(smalltalk.ClassCategoryReader);
 smalltalk.addClass('Stream', smalltalk.Object, ['collection', 'position', 'streamSize'], 'Kernel');
 smalltalk.addMethod(
 '_collection',
@@ -5917,6 +6134,7 @@ referencedClasses: []
 smalltalk.Stream.klass);
 
 
+smalltalk.setup(smalltalk.Stream);
 smalltalk.addClass('StringStream', smalltalk.Stream, [], 'Kernel');
 smalltalk.addMethod(
 '_next_',
@@ -6015,6 +6233,7 @@ smalltalk.StringStream);
 
 
 
+smalltalk.setup(smalltalk.StringStream);
 smalltalk.addClass('ClassCommentReader', smalltalk.Object, ['class', 'chunkParser'], 'Kernel');
 smalltalk.addMethod(
 '_class_',
@@ -6081,6 +6300,7 @@ smalltalk.ClassCommentReader);
 
 
 
+smalltalk.setup(smalltalk.ClassCommentReader);
 smalltalk.addClass('Random', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_next',
@@ -6114,6 +6334,7 @@ smalltalk.Random);
 
 
 
+smalltalk.setup(smalltalk.Random);
 smalltalk.addClass('Point', smalltalk.Object, ['x', 'y'], 'Kernel');
 smalltalk.addMethod(
 '_x',
@@ -6267,6 +6488,7 @@ referencedClasses: []
 smalltalk.Point.klass);
 
 
+smalltalk.setup(smalltalk.Point);
 smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel');
 smalltalk.addMethod(
 '_selector',
@@ -6345,6 +6567,7 @@ referencedClasses: []
 smalltalk.Message.klass);
 
 
+smalltalk.setup(smalltalk.Message);
 smalltalk.addClass('MessageNotUnderstood', smalltalk.Error, ['message', 'receiver'], 'Kernel');
 smalltalk.addMethod(
 '_message',
@@ -6423,3 +6646,146 @@ smalltalk.MessageNotUnderstood);
 
 
 
+smalltalk.setup(smalltalk.MessageNotUnderstood);
+smalltalk.addClass('ErrorHandler', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_handleError_',
+smalltalk.method({
+selector: 'handleError:',
+category: 'error handling',
+fn: function (anError){
+var self=this;
+smalltalk.send(smalltalk.send(anError, "_context", []), "_ifNotNil_", [(function(){return smalltalk.send(self, "_logErrorContext_", [smalltalk.send(anError, "_context", [])]);})]);
+smalltalk.send(self, "_logError_", [anError]);
+return self;},
+source: unescape('handleError%3A%20anError%0A%09anError%20context%20ifNotNil%3A%20%5Bself%20logErrorContext%3A%20anError%20context%5D.%0A%09self%20logError%3A%20anError'),
+messageSends: ["ifNotNil:", "context", "logErrorContext:", "logError:"],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler);
+
+smalltalk.addMethod(
+'_logContext_',
+smalltalk.method({
+selector: 'logContext:',
+category: 'private',
+fn: function (aContext){
+var self=this;
+smalltalk.send(smalltalk.send(aContext, "_home", []), "_ifNotNil_", [(function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})]);
+smalltalk.send(self, "_log_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aContext, "_receiver", []), "_asString", []), "__comma", [unescape("%3E%3E")]), "__comma", [smalltalk.send(aContext, "_selector", [])])]);
+return self;},
+source: unescape('logContext%3A%20aContext%0A%09aContext%20home%20ifNotNil%3A%20%5B%0A%09%09self%20logContext%3A%20aContext%20home%5D.%0A%09self%20log%3A%20aContext%20receiver%20asString%2C%20%27%3E%3E%27%2C%20aContext%20selector'),
+messageSends: ["ifNotNil:", "home", "logContext:", "log:", unescape("%2C"), "asString", "receiver", "selector"],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler);
+
+smalltalk.addMethod(
+'_logErrorContext_',
+smalltalk.method({
+selector: 'logErrorContext:',
+category: 'private',
+fn: function (aContext){
+var self=this;
+smalltalk.send(aContext, "_ifNotNil_", [(function(){return smalltalk.send(smalltalk.send(aContext, "_home", []), "_ifNotNil_", [(function(){return smalltalk.send(self, "_logContext_", [smalltalk.send(aContext, "_home", [])]);})]);})]);
+return self;},
+source: unescape('logErrorContext%3A%20aContext%0A%09aContext%20ifNotNil%3A%20%5B%0A%09%09aContext%20home%20ifNotNil%3A%20%5B%0A%09%09%09self%20logContext%3A%20aContext%20home%5D%5D'),
+messageSends: ["ifNotNil:", "home", "logContext:"],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler);
+
+smalltalk.addMethod(
+'_logError_',
+smalltalk.method({
+selector: 'logError:',
+category: 'private',
+fn: function (anError){
+var self=this;
+smalltalk.send(self, "_log_", [smalltalk.send(anError, "_messageText", [])]);
+return self;},
+source: unescape('logError%3A%20anError%0A%09self%20log%3A%20anError%20messageText'),
+messageSends: ["log:", "messageText"],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler);
+
+smalltalk.addMethod(
+'_log_',
+smalltalk.method({
+selector: 'log:',
+category: 'private',
+fn: function (aString){
+var self=this;
+smalltalk.send(console, "_log_", [aString]);
+return self;},
+source: unescape('log%3A%20aString%0A%09console%20log%3A%20aString'),
+messageSends: ["log:"],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler);
+
+
+smalltalk.ErrorHandler.klass.iVarNames = ['current'];
+smalltalk.addMethod(
+'_current',
+smalltalk.method({
+selector: 'current',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@current'];
+return self;},
+source: unescape('current%0A%09%5Ecurrent'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler.klass);
+
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_register", []);
+return self;},
+source: unescape('initialize%0A%09self%20register'),
+messageSends: ["register"],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler.klass);
+
+smalltalk.addMethod(
+'_register',
+smalltalk.method({
+selector: 'register',
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.ErrorHandler, "_setCurrent_", [smalltalk.send(self, "_new", [])]);
+return self;},
+source: unescape('register%0A%09ErrorHandler%20setCurrent%3A%20self%20new'),
+messageSends: ["setCurrent:", "new"],
+referencedClasses: [smalltalk.ErrorHandler]
+}),
+smalltalk.ErrorHandler.klass);
+
+smalltalk.addMethod(
+'_setCurrent_',
+smalltalk.method({
+selector: 'setCurrent:',
+category: 'accessing',
+fn: function (anHandler){
+var self=this;
+self['@current']=anHandler;
+return self;},
+source: unescape('setCurrent%3A%20anHandler%0A%09current%20%3A%3D%20anHandler'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ErrorHandler.klass);
+
+
+smalltalk.setup(smalltalk.ErrorHandler);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 17 - 0
js/Parser.js


+ 35 - 11
js/SUnit.js

@@ -55,7 +55,7 @@ var self=this;
 return self;},
 source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal'),
 messageSends: ["messageText:", "signal", "new"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.TestCase);
 
@@ -132,7 +132,7 @@ smalltalk.send(smalltalk.send(self, "_methods", []), "_do_", [(function(each){sm
 return self;},
 source: unescape('performTestFor%3A%20aResult%0A%09self%20methods%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%5B%5Bself%20perform%3A%20each%5D%0A%09%09%09on%3A%20TestFailure%20do%3A%20%5B%3Aex%20%7C%20aResult%20addFailure%3A%20self%20class%20name%2C%20%27%3E%3E%27%2C%20each%5D%5D%0A%09%09%09on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%20aResult%20addError%3A%20self%20class%20name%2C%20%27%3E%3E%27%2C%20each%5D.%0A%09%09aResult%20increaseRuns%5D'),
 messageSends: ["do:", "methods", "on:do:", "perform:", "addFailure:", unescape("%2C"), "name", "class", "addError:", "increaseRuns"],
-referencedClasses: [smalltalk.Error]
+referencedClasses: [smalltalk.nil,smalltalk.Error]
 }),
 smalltalk.TestCase);
 
@@ -168,6 +168,7 @@ smalltalk.TestCase);
 
 
 
+smalltalk.setup(smalltalk.TestCase);
 smalltalk.addClass('ExampleTest', smalltalk.TestCase, ['test'], 'SUnit');
 smalltalk.addMethod(
 '_testFailure',
@@ -216,7 +217,8 @@ smalltalk.ExampleTest);
 
 
 
-smalltalk.addClass('ProgressBar', smalltalk.TabWidget, ['percent', 'progressDiv'], 'SUnit');
+smalltalk.setup(smalltalk.ExampleTest);
+smalltalk.addClass('ProgressBar', smalltalk.TabWidget, ['percent', 'progressDiv', 'div'], 'SUnit');
 smalltalk.addMethod(
 '_percent',
 smalltalk.method({
@@ -254,10 +256,11 @@ selector: 'renderOn:',
 category: 'rendering',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["progress_bar"]);return smalltalk.send($rec, "_with_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["progress"]);return smalltalk.send($rec, "_style_", [smalltalk.send(smalltalk.send("width:", "__comma", [smalltalk.send(smalltalk.send(self, "_percent", []), "_asString", [])]), "__comma", [unescape("%25")])]);})(smalltalk.send(html, "_div", []));})]);})(smalltalk.send(html, "_div", []));
+self['@div']=(function($rec){smalltalk.send($rec, "_class_", ["progress_bar"]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_div", []));
+smalltalk.send(self, "_renderProgressBar", []);
 return self;},
-source: unescape('renderOn%3A%20html%20%0A%09html%20div%20%0A%09%09class%3A%20%27progress_bar%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09html%20div%20%0A%09%09%09%09class%3A%20%27progress%27%3B%0A%09%09%09%09style%3A%20%27width%3A%27%2C%20self%20percent%20asString%2C%20%27%25%27%5D'),
-messageSends: ["class:", "with:", "style:", unescape("%2C"), "asString", "percent", "div"],
+source: unescape('renderOn%3A%20html%20%0A%09div%20%3A%3D%20html%20div%20%0A%09%09class%3A%20%27progress_bar%27%3B%0A%09%09yourself.%0A%09self%20renderProgressBar'),
+messageSends: ["class:", "yourself", "div", "renderProgressBar"],
 referencedClasses: []
 }),
 smalltalk.ProgressBar);
@@ -270,19 +273,36 @@ category: 'updating',
 fn: function (aNumber){
 var self=this;
 smalltalk.send(self, "_percent_", [aNumber]);
-smalltalk.send(self, "_update", []);
+smalltalk.send(self, "_renderProgressBar", []);
+return self;},
+source: unescape('updatePercent%3A%20aNumber%0A%09self%20percent%3A%20aNumber.%0A%09self%20renderProgressBar'),
+messageSends: ["percent:", "renderProgressBar"],
+referencedClasses: []
+}),
+smalltalk.ProgressBar);
+
+smalltalk.addMethod(
+'_renderProgressBar',
+smalltalk.method({
+selector: 'renderProgressBar',
+category: 'rendering',
+fn: function (){
+var self=this;
+smalltalk.send(self['@div'], "_contents_", [(function(html){return (function($rec){smalltalk.send($rec, "_class_", ["progress"]);return smalltalk.send($rec, "_style_", [smalltalk.send(smalltalk.send("width:", "__comma", [smalltalk.send(smalltalk.send(self, "_percent", []), "_asString", [])]), "__comma", [unescape("%25")])]);})(smalltalk.send(html, "_div", []));})]);
 return self;},
-source: unescape('updatePercent%3A%20aNumber%0A%09self%20percent%3A%20aNumber.%0A%09self%20update'),
-messageSends: ["percent:", "update"],
+source: unescape('renderProgressBar%0A%09div%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09html%20div%20%0A%09%09%09class%3A%20%27progress%27%3B%0A%09%09%09style%3A%20%27width%3A%27%2C%20self%20percent%20asString%2C%20%27%25%27%5D'),
+messageSends: ["contents:", "class:", "style:", unescape("%2C"), "asString", "percent", "div"],
 referencedClasses: []
 }),
 smalltalk.ProgressBar);
 
 
 
+smalltalk.setup(smalltalk.ProgressBar);
 smalltalk.addClass('TestFailure', smalltalk.Error, [], 'SUnit');
 
 
+smalltalk.setup(smalltalk.TestFailure);
 smalltalk.addClass('TestRunner', smalltalk.TabWidget, ['selectedCategories', 'categoriesList', 'selectedClasses', 'classesList', 'selectedMethods', 'progressBar', 'methodsList', 'result', 'statusDiv'], 'SUnit');
 smalltalk.addMethod(
 '_label',
@@ -531,7 +551,7 @@ smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((func
 return self;},
 source: unescape('run%3A%20aCollection%0A%09result%20%3A%3D%20TestResult%20new.%0A%09self%20%0A%09%09updateStatusDiv%3B%0A%09%09updateMethodsList.%0A%09self%20progressBar%20updatePercent%3A%200.%0A%09result%20total%3A%20%28aCollection%20inject%3A%200%20into%3A%20%5B%3Aacc%20%3Aeach%20%7C%20acc%20+%20each%20methods%20size%5D%29.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%5Beach%20runCaseFor%3A%20result.%0A%09%09self%20progressBar%20updatePercent%3A%20result%20runs%20/%20result%20total%20*%20100.%0A%09%09self%20updateStatusDiv.%0A%09%09self%20updateMethodsList%5D%20valueWithTimeout%3A%20100%5D.'),
 messageSends: ["new", "updateStatusDiv", "updateMethodsList", "updatePercent:", "progressBar", "total:", "inject:into:", unescape("+"), "size", "methods", "do:", "valueWithTimeout:", "runCaseFor:", unescape("*"), unescape("/"), "runs", "total"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.TestRunner);
 
@@ -547,7 +567,7 @@ self['@result']=smalltalk.send(smalltalk.TestResult, "_new", []);
 return self;},
 source: unescape('initialize%0A%09super%20initialize.%0A%09result%20%3A%3D%20TestResult%20new'),
 messageSends: ["initialize", "new"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.TestRunner);
 
@@ -832,6 +852,7 @@ smalltalk.TestRunner);
 
 
 
+smalltalk.setup(smalltalk.TestRunner);
 smalltalk.addClass('TestResult', smalltalk.Object, ['timestamp', 'runs', 'errors', 'failures', 'total'], 'SUnit');
 smalltalk.addMethod(
 '_timestamp',
@@ -1005,6 +1026,7 @@ smalltalk.TestResult);
 
 
 
+smalltalk.setup(smalltalk.TestResult);
 smalltalk.addClass('ExampleTest2', smalltalk.TestCase, [], 'SUnit');
 smalltalk.addMethod(
 '_testPasses',
@@ -1023,6 +1045,7 @@ smalltalk.ExampleTest2);
 
 
 
+smalltalk.setup(smalltalk.ExampleTest2);
 smalltalk.addClass('ExampleTest3', smalltalk.TestCase, [], 'SUnit');
 smalltalk.addMethod(
 '_testPasses',
@@ -1041,3 +1064,4 @@ smalltalk.ExampleTest3);
 
 
 
+smalltalk.setup(smalltalk.ExampleTest3);

+ 121 - 30
js/boot.js

@@ -47,7 +47,6 @@ function SmalltalkNil(){};
 function Smalltalk(){
 
     var st = this;
-    st.debugMode = true;
 
     /* Smalltalk class creation. A class is an instance of an automatically 
        created metaclass object. Newly created classes (not their metaclass) 
@@ -102,11 +101,6 @@ function Smalltalk(){
 	var subclasses = st.subclasses(klass);
 	var methods;
 
-	// Initializing inst vars
-	for(var i=0;i<klass.iVarNames.length;i++) {
-	    klass.fn.prototype["@"+klass.iVarNames[i]] = nil;
-	}
-
 	if(klass.superclass && klass.superclass !== nil) {
 	    methods = st.methods(klass.superclass);
 
@@ -117,13 +111,6 @@ function Smalltalk(){
 		    klass.fn.prototype[methods[i].jsSelector] = methods[i].fn;
 		}
 	    }
-
-	    //Instance variables linking
-	    for(var i=0;i<klass.superclass.iVarNames.length;i++) {
-		if(!klass["@"+klass.superclass.iVarNames[i]]) {
-		    klass.fn.prototype["@"+klass.superclass.iVarNames[i]] = nil;
-		}
-	    }
 	}
 
 	for(var i=0;i<subclasses.length;i++) {
@@ -134,6 +121,11 @@ function Smalltalk(){
 	}
     };
 
+    st.setup = function(klass) {
+	st.init(klass);
+	klass._initialize();
+    }
+
     /* Answer all registered Smalltalk classes */
 
     st.classes = function() {
@@ -221,7 +213,7 @@ function Smalltalk(){
     /* Handles Smalltalk message send. Automatically converts undefined to the nil object.
        If the receiver does not understand the selector, call its #doesNotUnderstand: method */
 
-    st.send = function(receiver, selector, args, klass) {
+    sendWithoutContext = function(receiver, selector, args, klass) {
 	if(typeof receiver === "undefined") {
 	    receiver = nil;
 	}
@@ -233,13 +225,62 @@ function Smalltalk(){
 	return messageNotUnderstood(receiver, selector, args);
     };
 
+
+    /* Handles unhandled errors during message sends */
+
+    sendWithContext = function(receiver, selector, args, klass) {
+	if(thisContext) {
+	     return withContextSend(receiver, selector, args, klass);
+	} else {
+	    try {return withContextSend(receiver, selector, args, klass)}
+	    catch(error) {
+		// Reset the context stack in any case
+		thisContext = undefined;
+		if(error.smalltalkError) {
+		    handleError(error);
+		} else {
+		    throw(error);
+		}
+	    }
+	}
+    };
+
+    /* Same as sendWithoutContext but creates a methodContext. */
+
+    withContextSend = function(receiver, selector, args, klass) {
+	var call, context;
+	if(typeof receiver === "undefined") {
+	    receiver = nil;
+	}
+	if(!klass && receiver.klass && receiver[selector]) {
+	    context = pushContext(receiver, selector, args);
+	    call = receiver[selector].apply(receiver, args);
+	    popContext(context);
+	    return call;
+	} else if(klass && klass.fn.prototype[selector]) {
+	    context = pushContext(receiver, selector, args);
+	    call = klass.fn.prototype[selector].apply(receiver, args);
+	    popContext(context);
+	    return call;
+	}
+	return messageNotUnderstood(receiver, selector, args);
+    };
+
+    /* Handles Smalltalk errors. Triggers the registered ErrorHandler 
+       (See the Smalltalk class ErrorHandler and its subclasses */
+    
+    function handleError(error) {
+	thisContext = undefined;
+	smalltalk.ErrorHandler._current()._handleError_(error);
+    }
+
     /* Handles #dnu: *and* JavaScript method calls.
        if the receiver has no klass, we consider it a JS object (outside of the
        Jtalk system). Else assume that the receiver understands #doesNotUnderstand: */
 
     function messageNotUnderstood(receiver, selector, args) {
 	/* Handles JS method calls. */
-	if(receiver.klass === undefined) {
+	if(receiver.klass === undefined || receiver.allowJavaScriptCalls) {
 	    return callJavaScriptMethod(receiver, selector, args);
 	}
 
@@ -248,7 +289,7 @@ function Smalltalk(){
 	
 	return receiver._doesNotUnderstand_(
 	    st.Message._new()
-		._selector_(convertSelector(selector))
+		._selector_(st.convertSelector(selector))
 		._arguments_(args)
 	);
     };
@@ -269,18 +310,38 @@ function Smalltalk(){
 	if(typeof jsProperty === "function") {
 	    return jsProperty.apply(receiver, args);
 	} else if(jsProperty !== undefined) {
-	    return jsProperty
+	    if(args[0]) {
+		receiver[jsSelector] = args[0];
+		return nil;
+	    } else {
+		return jsProperty
+	    }
 	}
 	smalltalk.Error._signal_(receiver + ' is not a Jtalk object and "' + jsSelector + '" is undefined')
-    }
+    };
 
 	
+    /* Handle thisContext pseudo variable */
+    
+    pushContext = function(receiver, selector, temps) {
+	if(thisContext) {
+	    return thisContext = thisContext.newContext({receiver: receiver, selector: selector, temps: temps});
+	} else {
+	    return thisContext = new SmalltalkMethodContext({receiver: receiver, selector: selector, temps: temps});
+	}
+    };
+
+    popContext = function(context) {
+	if(context) {
+	    context.removeYourself();
+	}
+    };
 
     /* Convert a string to a valid smalltalk selector.
        if you modify the following functions, also change String>>asSelector
        accordingly */
 
-    function convertSelector(selector) {
+    st.convertSelector = function(selector) {
 	if(selector.match(/__/)) {
 	    return convertBinarySelector(selector);
 	} else {
@@ -325,27 +386,56 @@ function Smalltalk(){
 	}
 	return object;
     };
+
+    /* Toggle deployment mode (no context will be handled during message send */
+    st.setDeploymentMode = function() {
+	st.send = sendWithoutContext;
+    };
+
+    st.setDevelopmentMode = function() {
+	st.send = sendWithContext;
+    }
+
+    /* Set development mode by default */
+    st.setDevelopmentMode();
 }
 
-function SmalltalkMethodContext() {
-    this.stack = [];
+function SmalltalkMethodContext(spec) {
+    var that = this;
+    spec = spec || {};
+    that.homeContext = spec.homeContext;
+    that.selector = spec.selector;
+    that.receiver = spec.receiver;
+    that.temps = spec.temps || {};
+
+    that.newContext = function(spec) {
+	spec = spec || {};
+	return new SmalltalkMethodContext({homeContext: that, receiver: spec.receiver, selector: spec.selector, temps: spec.temps});
+    }
 
-    this.push = function(context) {
-	stack.push(context);
-    };
-    
-    this.pop = function() {
-	stack.pop();
-    };
+    that.removeYourself = function() {
+	thisContext = that.homeContext;
+    }
 }
 
 /* Global Smalltalk objects. nil and thisContext shouldn't be globals. */
 
 var nil = new SmalltalkNil();
 var smalltalk = new Smalltalk();
-var thisContext = nil;
+var thisContext = undefined;
 
 
+/* Utilities */
+
+Array.prototype.remove = function(s){
+    var index = this.indexOf(s);
+    if(this.indexOf(s) != -1)this.splice(index, 1);
+}
+
+if(this.jQuery) {
+    this.jQuery.allowJavaScriptCalls = true;
+}
+
 /****************************************************************************************/
 
 
@@ -374,7 +464,8 @@ smalltalk.mapClassName("Array", "Kernel", Array, smalltalk.SequenceableCollectio
 smalltalk.mapClassName("RegularExpression", "Kernel", RegExp, smalltalk.String);
 
 smalltalk.mapClassName("Error", "Kernel", Error, smalltalk.Object);
+smalltalk.mapClassName("MethodContext", "Kernel", SmalltalkMethodContext, smalltalk.Object);
 
 if(this.CanvasRenderingContext2D) {
     smalltalk.mapClassName("CanvasRenderingContext", "Canvas", CanvasRenderingContext2D, smalltalk.Object);
-}
+}

+ 0 - 2
js/init.js

@@ -1,2 +0,0 @@
-smalltalk.init(smalltalk.Object);
-smalltalk.classes()._do_(function(each) {each._initialize()});

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels