Browse Source

sync with master branch

Nicolas Petton 13 years ago
parent
commit
4d34c744da
6 changed files with 200 additions and 206 deletions
  1. 24 24
      js/Canvas.js
  2. 7 7
      js/Compiler.js
  3. 11 11
      js/IDE.js
  4. 112 126
      js/Kernel.js
  5. 16 16
      js/Parser.js
  6. 30 22
      js/boot.js

+ 24 - 24
js/Canvas.js

@@ -8,7 +8,7 @@ fn: function (aString){
 var self=this;
 self.fillStyle = String(aString);
 return self;},
-source: unescape('fillStyle%3A%20aString%0A%09%7B%27self.fillStyle%20%3D%20String%28aString%29%27%7D'),
+source: unescape('fillStyle%3A%20aString%0A%09%3Cself.fillStyle%20%3D%20String%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -23,7 +23,7 @@ fn: function (){
 var self=this;
 self.beginPath();
 return self;},
-source: unescape('beginPath%0A%09%7B%27self.beginPath%28%29%27%7D'),
+source: unescape('beginPath%0A%09%3Cself.beginPath%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -38,7 +38,7 @@ fn: function (){
 var self=this;
 self.closePath();
 return self;},
-source: unescape('closePath%0A%09%7B%27self.closePath%28%29%27%7D'),
+source: unescape('closePath%0A%09%3Cself.closePath%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -53,7 +53,7 @@ fn: function (){
 var self=this;
 self.fill();
 return self;},
-source: unescape('fill%0A%09%7B%27self.fill%28%29%27%7D'),
+source: unescape('fill%0A%09%3Cself.fill%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -68,7 +68,7 @@ fn: function (){
 var self=this;
 self.stroke();
 return self;},
-source: unescape('stroke%0A%09%7B%27self.stroke%28%29%27%7D'),
+source: unescape('stroke%0A%09%3Cself.stroke%28%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -83,7 +83,7 @@ fn: function (aPoint){
 var self=this;
 self.moveTo(aPoint._x(), aPoint._y());
 return self;},
-source: unescape('moveTo%3A%20aPoint%0A%09%7B%27self.moveTo%28aPoint._x%28%29%2C%20aPoint._y%28%29%29%27%7D'),
+source: unescape('moveTo%3A%20aPoint%0A%09%3Cself.moveTo%28aPoint._x%28%29%2C%20aPoint._y%28%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -98,7 +98,7 @@ fn: function (aPoint){
 var self=this;
 self.lineTo(aPoint._x(), aPoint._y());
 return self;},
-source: unescape('lineTo%3A%20aPoint%0A%09%7B%27self.lineTo%28aPoint._x%28%29%2C%20aPoint._y%28%29%29%27%7D'),
+source: unescape('lineTo%3A%20aPoint%0A%09%3Cself.lineTo%28aPoint._x%28%29%2C%20aPoint._y%28%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -113,7 +113,7 @@ fn: function (aPoint, aNumber, aNumber2, aNumber3, aBoolean){
 var self=this;
 self.arc(aPoint._x(), aPoint._y(), aNumber, aNumber2, aNumber3, aBoolean);
 return self;},
-source: unescape('arcTo%3A%20aPoint%20radius%3A%20aNumber%20startAngle%3A%20aNumber2%20endAngle%3A%20aNumber3%20anticlockwise%3A%20aBoolean%0A%09%7B%27self.arc%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20aNumber%2C%20aNumber2%2C%20aNumber3%2C%20aBoolean%29%27%7D'),
+source: unescape('arcTo%3A%20aPoint%20radius%3A%20aNumber%20startAngle%3A%20aNumber2%20endAngle%3A%20aNumber3%20anticlockwise%3A%20aBoolean%0A%09%3Cself.arc%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20aNumber%2C%20aNumber2%2C%20aNumber3%2C%20aBoolean%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -143,7 +143,7 @@ fn: function (aPoint, anotherPoint){
 var self=this;
 self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
 return self;},
-source: unescape('fillRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%7B%27self.fillRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%27%7D'),
+source: unescape('fillRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%3Cself.fillRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -158,7 +158,7 @@ fn: function (aPoint, anotherPoint){
 var self=this;
 self.strokeRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
 return self;},
-source: unescape('strokeRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%7B%27self.strokeRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%27%7D'),
+source: unescape('strokeRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%3Cself.strokeRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -173,7 +173,7 @@ fn: function (aPoint, anotherPoint){
 var self=this;
 self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
 return self;},
-source: unescape('clearRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%7B%27self.fillRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%27%7D'),
+source: unescape('clearRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%3Cself.fillRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -188,7 +188,7 @@ fn: function (aString){
 var self=this;
 self.strokeStyle = String(aString);
 return self;},
-source: unescape('strokeStyle%3A%20aString%0A%09%7B%27self.strokeStyle%20%3D%20String%28aString%29%27%7D'),
+source: unescape('strokeStyle%3A%20aString%0A%09%3Cself.strokeStyle%20%3D%20String%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -203,7 +203,7 @@ fn: function (aNumber){
 var self=this;
 self.lineWidth = aNumber;
 return self;},
-source: unescape('lineWidth%3A%20aNumber%0A%09%7B%27self.lineWidth%20%3D%20aNumber%27%7D'),
+source: unescape('lineWidth%3A%20aNumber%0A%09%3Cself.lineWidth%20%3D%20aNumber%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -219,7 +219,7 @@ fn: function (aTagBrush){
 var self=this;
 return aTagBrush._element().getContext('2d');
 return self;},
-source: unescape('tagBrush%3A%20aTagBrush%0A%09%7B%27return%20aTagBrush._element%28%29.getContext%28%27%272d%27%27%29%27%7D'),
+source: unescape('tagBrush%3A%20aTagBrush%0A%09%3Creturn%20aTagBrush._element%28%29.getContext%28%272d%27%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -801,7 +801,7 @@ fn: function (anElement){
 var self=this;
 self['@element'].appendChild(anElement);
 return self;},
-source: unescape('appendChild%3A%20anElement%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.appendChild%28anElement%29%27%7D'),
+source: unescape('appendChild%3A%20anElement%0A%20%20%20%20%3Cself%5B%27@element%27%5D.appendChild%28anElement%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -831,7 +831,7 @@ fn: function (aString, aValue){
 var self=this;
 self['@element'].setAttribute(aString, aValue);
 return self;},
-source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.setAttribute%28aString%2C%20aValue%29%27%7D'),
+source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%3Cself%5B%27@element%27%5D.setAttribute%28aString%2C%20aValue%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -846,7 +846,7 @@ fn: function (aString){
 var self=this;
 self['@element'].removeAttribute(aString);
 return self;},
-source: unescape('removeAt%3A%20aString%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.removeAttribute%28aString%29%27%7D'),
+source: unescape('removeAt%3A%20aString%0A%20%20%20%20%3Cself%5B%27@element%27%5D.removeAttribute%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -982,7 +982,7 @@ fn: function (){
 var self=this;
 return smalltalk.JQuery._from_(jQuery(self['@element']));
 return self;},
-source: unescape('asJQuery%0A%09%7B%27return%20smalltalk.JQuery._from_%28jQuery%28self%5B%27%27@element%27%27%5D%29%29%27%7D'),
+source: unescape('asJQuery%0A%09%3Creturn%20smalltalk.JQuery._from_%28jQuery%28self%5B%27@element%27%5D%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1117,7 +1117,7 @@ fn: function (aString){
 var self=this;
 return document.createElement(String(aString));
 return self;},
-source: unescape('createElementFor%3A%20aString%0A%09%7B%27return%20document.createElement%28String%28aString%29%29%27%7D'),
+source: unescape('createElementFor%3A%20aString%0A%09%3Creturn%20document.createElement%28String%28aString%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1132,7 +1132,7 @@ fn: function (aString){
 var self=this;
 return document.createTextNode(String(aString));
 return self;},
-source: unescape('createTextNodeFor%3A%20aString%0A%09%7B%27return%20document.createTextNode%28String%28aString%29%29%27%7D'),
+source: unescape('createTextNodeFor%3A%20aString%0A%09%3Creturn%20document.createTextNode%28String%28aString%29%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1211,7 +1211,7 @@ fn: function (aString){
 var self=this;
 alert(aString);
 return self;},
-source: unescape('alert%3A%20aString%0A%20%20%20%20%7B%27alert%28aString%29%27%7D'),
+source: unescape('alert%3A%20aString%0A%20%20%20%20%3Calert%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1226,7 +1226,7 @@ fn: function (aString){
 var self=this;
 return window.confirm(aString);
 return self;},
-source: unescape('confirm%3A%20aString%0A%20%20%20%20%7B%27return%20window.confirm%28aString%29%27%7D'),
+source: unescape('confirm%3A%20aString%0A%20%20%20%20%3Creturn%20window.confirm%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1256,7 +1256,7 @@ fn: function (aString, anotherString){
 var self=this;
 return window.prompt(aString, anotherString);
 return self;},
-source: unescape('prompt%3A%20aString%20default%3A%20anotherString%0A%20%20%20%20%7B%27return%20window.prompt%28aString%2C%20anotherString%29%27%7D'),
+source: unescape('prompt%3A%20aString%20default%3A%20anotherString%0A%20%20%20%20%3Creturn%20window.prompt%28aString%2C%20anotherString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1326,7 +1326,7 @@ fn: function (){
 var self=this;
 return document.createElement('canvas');
 return self;},
-source: unescape('createElement%0A%09%7B%27return%20document.createElement%28%27%27canvas%27%27%29%27%7D'),
+source: unescape('createElement%0A%09%3Creturn%20document.createElement%28%27canvas%27%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),

+ 7 - 7
js/Compiler.js

@@ -1065,7 +1065,7 @@ fn: function (aString){
 var self=this;
 return eval(aString);
 return self;},
-source: unescape('eval%3A%20aString%0A%09%7B%27return%20eval%28aString%29%27%7D'),
+source: unescape('eval%3A%20aString%0A%09%3Creturn%20eval%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1353,10 +1353,10 @@ selector: 'visitJSStatementNode:',
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(aNode, "_source", []), "_value", []), "_replace_with_", [unescape("%27%27"), unescape("%27")])]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_source", []), "_replace_with_", [unescape("%3E%3E"), unescape("%3E")])]);
 return self;},
-source: unescape('visitJSStatementNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%28aNode%20source%20value%20replace%3A%20%27%27%27%27%27%27%20with%3A%20%27%27%27%27%29'),
-messageSends: ["nextPutAll:", "replace:with:", "value", "source"],
+source: unescape('visitJSStatementNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%28aNode%20source%20replace%3A%20%27%3E%3E%27%20with%3A%20%27%3E%27%29'),
+messageSends: ["nextPutAll:", "replace:with:", "source"],
 referencedClasses: []
 }),
 smalltalk.Compiler);
@@ -1555,10 +1555,10 @@ selector: 'doIt',
 category: '',
 fn: function (){
 var self=this;
-return smalltalk.send((function(){return smalltalk.send("abc", "_trimLeft_", ["az"]);}), "_value", []);
+return smalltalk.send((function(){return self["@"+'foo'];}), "_value", []);
 return self;},
-source: unescape('doIt%20%5E%5B%27abc%27%20trimLeft%3A%20%27az%27%5D%20value'),
-messageSends: ["value", "trimLeft:"],
+source: unescape('doIt%20%5E%5B%3Cself%5B%22@%22+%27foo%27%5D%3E%5D%20value'),
+messageSends: ["value"],
 referencedClasses: []
 }),
 smalltalk.DoIt);

+ 11 - 11
js/IDE.js

@@ -36,9 +36,9 @@ selector: 'updatePosition',
 category: 'actions',
 fn: function (){
 var self=this;
-jQuery('#jtalk').css('top', '').css('bottom', '27px');;
+jQuery('#jtalk').css('top', '').css('bottom', '27px');
 return self;},
-source: unescape('updatePosition%0A%20%20%20%20%7B%27jQuery%28%27%27%23jtalk%27%27%29.css%28%27%27top%27%27%2C%20%27%27%27%27%27%27%29.css%28%27%27bottom%27%27%2C%20%27%2727px%27%27%29%3B%27%7D'),
+source: unescape('updatePosition%0A%20%20%20%20%3CjQuery%28%27%23jtalk%27%29.css%28%27top%27%2C%20%27%27%29.css%28%27bottom%27%2C%20%2727px%27%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -85,9 +85,9 @@ jQuery('#jtalk').resizable({
 	handles: 'n', 
 	resize: aBlock,
 	minHeight: 230
-});;
+});
 return self;},
-source: unescape('onResize%3A%20aBlock%0A%20%20%20%20%7B%27jQuery%28%27%27%23jtalk%27%27%29.resizable%28%7B%0A%09handles%3A%20%27%27n%27%27%2C%20%0A%09resize%3A%20aBlock%2C%0A%09minHeight%3A%20230%0A%7D%29%3B%27%7D'),
+source: unescape('onResize%3A%20aBlock%0A%20%20%20%20%3CjQuery%28%27%23jtalk%27%29.resizable%28%7B%0A%09handles%3A%20%27n%27%2C%20%0A%09resize%3A%20aBlock%2C%0A%09minHeight%3A%20230%0A%7D%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -102,7 +102,7 @@ fn: function (aBlock){
 var self=this;
 jQuery(window).resize(aBlock);
 return self;},
-source: unescape('onWindowResize%3A%20aBlock%0A%20%20%20%20%7B%27jQuery%28window%29.resize%28aBlock%29%27%7D'),
+source: unescape('onWindowResize%3A%20aBlock%0A%20%20%20%20%3CjQuery%28window%29.resize%28aBlock%29%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -442,7 +442,7 @@ fn: function (){
 var self=this;
 return document.selection;
 return self;},
-source: unescape('selection%0A%20%20%20%20%7B%27return%20document.selection%27%7D'),
+source: unescape('selection%0A%20%20%20%20%3Creturn%20document.selection%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -457,7 +457,7 @@ fn: function (){
 var self=this;
 return jQuery('.jt_workspace')[0].selectionStart;
 return self;},
-source: unescape('selectionStart%0A%20%20%20%20%7B%27return%20jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionStart%27%7D'),
+source: unescape('selectionStart%0A%20%20%20%20%3Creturn%20jQuery%28%27.jt_workspace%27%29%5B0%5D.selectionStart%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -472,7 +472,7 @@ fn: function (){
 var self=this;
 return jQuery('.jt_workspace')[0].selectionEnd;
 return self;},
-source: unescape('selectionEnd%0A%20%20%20%20%7B%27return%20jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionEnd%27%7D'),
+source: unescape('selectionEnd%0A%20%20%20%20%3Creturn%20jQuery%28%27.jt_workspace%27%29%5B0%5D.selectionEnd%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -487,7 +487,7 @@ fn: function (anInteger){
 var self=this;
 jQuery('.jt_workspace')[0].selectionStart = anInteger;
 return self;},
-source: unescape('selectionStart%3A%20anInteger%0A%20%20%20%20%7B%27jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionStart%20%3D%20anInteger%27%7D'),
+source: unescape('selectionStart%3A%20anInteger%0A%20%20%20%20%3CjQuery%28%27.jt_workspace%27%29%5B0%5D.selectionStart%20%3D%20anInteger%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -502,7 +502,7 @@ fn: function (anInteger){
 var self=this;
 jQuery('.jt_workspace')[0].selectionEnd = anInteger;
 return self;},
-source: unescape('selectionEnd%3A%20anInteger%0A%20%20%20%20%7B%27jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionEnd%20%3D%20anInteger%27%7D'),
+source: unescape('selectionEnd%3A%20anInteger%0A%20%20%20%20%3CjQuery%28%27.jt_workspace%27%29%5B0%5D.selectionEnd%20%3D%20anInteger%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -554,7 +554,7 @@ if(anEvent.ctrlKey) {
 		}
 	};
 return self;},
-source: unescape('handleKeyDown%3A%20anEvent%0A%20%20%20%20%7B%27if%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2080%29%20%7B%20//ctrl+p%0A%09%09%09self._printIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2068%29%20%7B%20//ctrl+d%0A%09%09%09self._doIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2073%29%20%7B%20//ctrl+i%0A%09%09%09self._inspectIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%27%7D'),
+source: unescape('handleKeyDown%3A%20anEvent%0A%20%20%20%20%3Cif%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2080%29%20%7B%20//ctrl+p%0A%09%09%09self._printIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2068%29%20%7B%20//ctrl+d%0A%09%09%09self._doIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2073%29%20%7B%20//ctrl+i%0A%09%09%09self._inspectIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%3E'),
 messageSends: [],
 referencedClasses: []
 }),

File diff suppressed because it is too large
+ 112 - 126
js/Kernel.js


File diff suppressed because it is too large
+ 16 - 16
js/Parser.js


+ 30 - 22
js/boot.js

@@ -195,13 +195,12 @@ function Smalltalk(){
 	if(typeof receiver === "undefined") {
 	    receiver = nil;
 	}
-	var klass = klass || receiver.klass;
-	if(!klass) { return messageNotUnderstood(receiver, selector, args) };
-	var method = klass.fn.prototype[selector];
-	if(!method) {
-	    return messageNotUnderstood(receiver, selector, args);
+	if(!klass && receiver.klass && receiver[selector]) {
+	    return receiver[selector].apply(receiver, args);
+	} else if(klass && klass.fn.prototype[selector]) {
+	    return klass.fn.prototype[selector].apply(receiver, args)
 	}
-	return method.apply(receiver, args);
+	return messageNotUnderstood(receiver, selector, args);
     };
 
     /* Handles #dnu: *and* JavaScript method calls.
@@ -209,27 +208,13 @@ function Smalltalk(){
        Jtalk system). Else assume that the receiver understands #doesNotUnderstand: */
 
     function messageNotUnderstood(receiver, selector, args) {
-	/* Handles JS method calls. Assumes that a single array or single argument was passed from Jtalk.
-	   Example: someJSObject foo: #(1 2 3) -> someJSObject.foo(1,2,3); */
-	var jsSelector = selector.replace(/_/g, '');
-	var jsProperty = receiver[jsSelector];
-	var jsArguments;
+	/* Handles JS method calls. */
 	if(receiver.klass === undefined) {
-	    if(typeof jsProperty === "function") {
-		if(args[0] && args[0].constructor === Array) {
-		    jsArguments = args[0]
-		} else {
-		    jsArguments = [args[0]]
-		}
-		return jsProperty.apply(receiver, jsArguments);
-	    } else if(jsProperty !== undefined) {
-		return jsProperty
-	    }
+	    return callJavaScriptMethod(receiver, selector, args);
 	}
 
 	/* Handles not understood messages. Also see the Jtalk counter-part 
 	   Object>>doesNotUnderstand: */
-	if(!receiver.klass) {throw(receiver + ' is not a Jtalk object and ' + jsSelector + ' is undefined')}
 	
 	return receiver._doesNotUnderstand_(
 	    st.Message._new()
@@ -238,6 +223,29 @@ function Smalltalk(){
 	);
     };
 
+    function callJavaScriptMethod(receiver, selector, args) {
+	/* Call a method of a JS object, or answer a property.
+ 
+	   Converts keyword-based selectors by using the first
+	   keyword only, but keeping all message arguments.
+
+	   Example:
+	   "self do: aBlock with: anObject" -> "self.do(aBlock, anObject)" */
+
+	var jsSelector = selector
+	    .replace(/^_/, '')
+	    .replace(/_.*/g, '');
+	var jsProperty = receiver[jsSelector];
+	if(typeof jsProperty === "function") {
+	    return jsProperty.apply(receiver, args);
+	} else if(jsProperty !== undefined) {
+	    return jsProperty
+	}
+	smalltalk.Error._signal_(receiver + ' is not a Jtalk object and "' + jsSelector + '" is undefined')
+    }
+
+	
+
     /* Convert a string to a valid smalltalk selector.
        if you modify the following functions, also change String>>asSelector
        accordingly */

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