Browse Source

Rewrote all methods including inlined JS statements

Nicolas Petton 12 years ago
parent
commit
a657a736ce

+ 0 - 15
js/Compiler-Tests.deploy.js

@@ -578,21 +578,6 @@ return self}, self, "testUnknownVariables", [], smalltalk.SemanticAnalyzerTest)}
 }),
 smalltalk.SemanticAnalyzerTest);
 
-smalltalk.addMethod(
-"_testUnknownVariablesDefinedInJS",
-smalltalk.method({
-selector: "testUnknownVariablesDefinedInJS",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
 var someVariable = 1 ;
-;
-_st(self)._shouldnt_raise_((function(){
-return smalltalk.withContext(function($ctx2) { 
return _st(smalltalk)._parse_("foo someVariable");
-})}),(smalltalk.UnknownVariableError || UnknownVariableError));
-return self}, self, "testUnknownVariablesDefinedInJS", [], smalltalk.SemanticAnalyzerTest)}
-}),
-smalltalk.SemanticAnalyzerTest);
-
 smalltalk.addMethod(
 "_testUnknownVariablesWithScope",
 smalltalk.method({

+ 0 - 20
js/Compiler-Tests.js

@@ -773,26 +773,6 @@ referencedClasses: ["UnknownVariableError"]
 }),
 smalltalk.SemanticAnalyzerTest);
 
-smalltalk.addMethod(
-"_testUnknownVariablesDefinedInJS",
-smalltalk.method({
-selector: "testUnknownVariablesDefinedInJS",
-category: 'tests',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
 var someVariable = 1 ;
-;
-_st(self)._shouldnt_raise_((function(){
-return smalltalk.withContext(function($ctx2) { 
return _st(smalltalk)._parse_("foo someVariable");
-})}),(smalltalk.UnknownVariableError || UnknownVariableError));
-return self}, self, "testUnknownVariablesDefinedInJS", [], smalltalk.SemanticAnalyzerTest)},
-args: [],
-source: "testUnknownVariablesDefinedInJS\x0a\x0a\x09< var someVariable = 1 >.\x0a\x0a\x09self shouldnt: [ smalltalk parse: 'foo someVariable' ] raise: UnknownVariableError",
-messageSends: ["shouldnt:raise:", "parse:"],
-referencedClasses: ["UnknownVariableError"]
-}),
-smalltalk.SemanticAnalyzerTest);
-
 smalltalk.addMethod(
 "_testUnknownVariablesWithScope",
 smalltalk.method({

+ 6 - 6
js/IDE.deploy.js

@@ -2998,8 +2998,7 @@ smalltalk.method({
 selector: "renderButtonsOn:",
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15;
-_st(self)._inspect();
+return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16;
 $1=_st(html)._button();
 _st($1)._with_("Save");
 $2=_st($1)._onClick_((function(){
@@ -3038,10 +3037,11 @@ $14=_st($13)._onClick_((function(){
 return smalltalk.withContext(function($ctx2) { 
return _st(self)._inspectSelectedVariable();
 })}));
 self["@inspectButton"]=$14;
-_st(self)._updateSourceArea();
-_st(self)._updateStatus();
-_st(self)._updateVariablesList();
-$15=_st(self)._updateInspector();
+$15=self;
+_st($15)._updateSourceArea();
+_st($15)._updateStatus();
+_st($15)._updateVariablesList();
+$16=_st($15)._updateInspector();
 return self}, self, "renderButtonsOn:", [html], smalltalk.Debugger)}
 }),
 smalltalk.Debugger);

+ 8 - 8
js/IDE.js

@@ -3809,8 +3809,7 @@ selector: "renderButtonsOn:",
 category: 'rendering',
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15;
-_st(self)._inspect();
+return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16;
 $1=_st(html)._button();
 _st($1)._with_("Save");
 $2=_st($1)._onClick_((function(){
@@ -3849,14 +3848,15 @@ $14=_st($13)._onClick_((function(){
 return smalltalk.withContext(function($ctx2) { 
return _st(self)._inspectSelectedVariable();
 })}));
 self["@inspectButton"]=$14;
-_st(self)._updateSourceArea();
-_st(self)._updateStatus();
-_st(self)._updateVariablesList();
-$15=_st(self)._updateInspector();
+$15=self;
+_st($15)._updateSourceArea();
+_st($15)._updateStatus();
+_st($15)._updateVariablesList();
+$16=_st($15)._updateInspector();
 return self}, self, "renderButtonsOn:", [html], smalltalk.Debugger)},
 args: ["html"],
-source: "renderButtonsOn: html\x0a\x09self inspect.\x0a\x09saveButton := html button\x0a\x09\x09with: 'Save';\x0a\x09\x09onClick: [self save].\x0a\x09html button\x0a\x09\x09with: 'DoIt';\x0a\x09\x09onClick: [sourceArea doIt].\x0a\x09html button\x0a\x09\x09with: 'PrintIt';\x0a\x09\x09onClick: [sourceArea printIt].\x0a\x09html button\x0a\x09\x09with: 'InspectIt';\x0a\x09\x09onClick: [sourceArea inspectIt].\x0a\x09html button \x0a\x09\x09with: 'Proceed';\x0a\x09\x09onClick: [self proceed].\x0a\x09html button\x0a\x09\x09with: 'Abandon';\x0a\x09\x09onClick: [self close].\x0a\x09inspectButton := html button\x0a\x09\x09class: 'amber_button debugger inspect';\x0a\x09\x09with: 'Inspect';\x0a\x09\x09onClick: [self inspectSelectedVariable].\x0a\x09 self \x0a\x09\x09updateSourceArea;\x0a\x09\x09updateStatus;\x0a\x09\x09updateVariablesList;\x0a\x09\x09updateInspector",
-messageSends: ["inspect", "with:", "button", "onClick:", "save", "doIt", "printIt", "inspectIt", "proceed", "close", "class:", "inspectSelectedVariable", "updateSourceArea", "updateStatus", "updateVariablesList", "updateInspector"],
+source: "renderButtonsOn: html\x0a\x09saveButton := html button\x0a\x09\x09with: 'Save';\x0a\x09\x09onClick: [self save].\x0a\x09html button\x0a\x09\x09with: 'DoIt';\x0a\x09\x09onClick: [sourceArea doIt].\x0a\x09html button\x0a\x09\x09with: 'PrintIt';\x0a\x09\x09onClick: [sourceArea printIt].\x0a\x09html button\x0a\x09\x09with: 'InspectIt';\x0a\x09\x09onClick: [sourceArea inspectIt].\x0a\x09html button \x0a\x09\x09with: 'Proceed';\x0a\x09\x09onClick: [self proceed].\x0a\x09html button\x0a\x09\x09with: 'Abandon';\x0a\x09\x09onClick: [self close].\x0a\x09inspectButton := html button\x0a\x09\x09class: 'amber_button debugger inspect';\x0a\x09\x09with: 'Inspect';\x0a\x09\x09onClick: [self inspectSelectedVariable].\x0a\x09 self \x0a\x09\x09updateSourceArea;\x0a\x09\x09updateStatus;\x0a\x09\x09updateVariablesList;\x0a\x09\x09updateInspector",
+messageSends: ["with:", "button", "onClick:", "save", "doIt", "printIt", "inspectIt", "proceed", "close", "class:", "inspectSelectedVariable", "updateSourceArea", "updateStatus", "updateVariablesList", "updateInspector"],
 referencedClasses: []
 }),
 smalltalk.Debugger);

+ 1 - 5
js/Importer-Exporter.deploy.js

@@ -608,12 +608,8 @@ selector: "initializePackageNamed:prefix:",
 fn: function (packageName,aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-_st(_st(_st((smalltalk.Package || Package))._named_(packageName))._classes())._do_((function(each){
-return smalltalk.withContext(function($ctx2) { 
smalltalk.init(each);
-;
-return _st(each)._initialize();
-})}));
 $1=_st((smalltalk.Package || Package))._named_(packageName);
+_st($1)._setupClasses();
 _st($1)._commitPathJs_(_st(_st("/").__comma(aString)).__comma("/js"));
 $2=_st($1)._commitPathSt_(_st(_st("/").__comma(aString)).__comma("/st"));
 return self}, self, "initializePackageNamed:prefix:", [packageName,aString], smalltalk.PackageLoader)}

+ 6 - 10
js/Importer-Exporter.js

@@ -730,22 +730,18 @@ smalltalk.addMethod(
 "_initializePackageNamed_prefix_",
 smalltalk.method({
 selector: "initializePackageNamed:prefix:",
-category: 'not yet classified',
+category: 'laoding',
 fn: function (packageName,aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-_st(_st(_st((smalltalk.Package || Package))._named_(packageName))._classes())._do_((function(each){
-return smalltalk.withContext(function($ctx2) { 
smalltalk.init(each);
-;
-return _st(each)._initialize();
-})}));
 $1=_st((smalltalk.Package || Package))._named_(packageName);
+_st($1)._setupClasses();
 _st($1)._commitPathJs_(_st(_st("/").__comma(aString)).__comma("/js"));
 $2=_st($1)._commitPathSt_(_st(_st("/").__comma(aString)).__comma("/st"));
 return self}, self, "initializePackageNamed:prefix:", [packageName,aString], smalltalk.PackageLoader)},
 args: ["packageName", "aString"],
-source: "initializePackageNamed: packageName prefix: aString\x0a\x0a\x09(Package named: packageName) classes do: [ :each |\x0a    \x09<smalltalk.init(each)>.\x0a        each initialize. ].\x0a        \x0a    (Package named: packageName) \x0a    \x09commitPathJs: '/', aString, '/js';\x0a        commitPathSt: '/', aString, '/st'",
-messageSends: ["do:", "initialize", "classes", "named:", "commitPathJs:", ",", "commitPathSt:"],
+source: "initializePackageNamed: packageName prefix: aString\x0a\x0a\x09(Package named: packageName) \x0a    \x09setupClasses;\x0a        commitPathJs: '/', aString, '/js';\x0a        commitPathSt: '/', aString, '/st'",
+messageSends: ["setupClasses", "named:", "commitPathJs:", ",", "commitPathSt:"],
 referencedClasses: ["Package"]
 }),
 smalltalk.PackageLoader);
@@ -754,7 +750,7 @@ smalltalk.addMethod(
 "_loadPackage_prefix_",
 smalltalk.method({
 selector: "loadPackage:prefix:",
-category: 'not yet classified',
+category: 'laoding',
 fn: function (packageName,aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
@@ -780,7 +776,7 @@ smalltalk.addMethod(
 "_loadPackages_prefix_",
 smalltalk.method({
 selector: "loadPackages:prefix:",
-category: 'not yet classified',
+category: 'laoding',
 fn: function (aCollection,aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(aCollection)._do_((function(each){

+ 62 - 20
js/Kernel-Classes.deploy.js

@@ -7,8 +7,7 @@ selector: "addCompiledMethod:",
 fn: function (aMethod){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
-;
+_st(self)._basicAddCompiledMethod_(aMethod);
 $1=_st((smalltalk.MethodAdded || MethodAdded))._new();
 _st($1)._theClass_(self);
 _st($1)._method_(aMethod);
@@ -76,6 +75,17 @@ return $2;
 }),
 smalltalk.Behavior);
 
+smalltalk.addMethod(
+"_basicAddCompiledMethod_",
+smalltalk.method({
+selector: "basicAddCompiledMethod:",
+fn: function (aMethod){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
+return self}, self, "basicAddCompiledMethod:", [aMethod], smalltalk.Behavior)}
+}),
+smalltalk.Behavior);
+
 smalltalk.addMethod(
 "_basicNew",
 smalltalk.method({
@@ -88,6 +98,20 @@ return self}, self, "basicNew", [], smalltalk.Behavior)}
 }),
 smalltalk.Behavior);
 
+smalltalk.addMethod(
+"_basicRemoveCompiledMethod_",
+smalltalk.method({
+selector: "basicRemoveCompiledMethod:",
+fn: function (aMethod){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+    	smalltalk.removeMethod(aMethod)
+		smalltalk.init(self);
+    ;
+return self}, self, "basicRemoveCompiledMethod:", [aMethod], smalltalk.Behavior)}
+}),
+smalltalk.Behavior);
+
 smalltalk.addMethod(
 "_canUnderstand_",
 smalltalk.method({
@@ -447,11 +471,7 @@ selector: "removeCompiledMethod:",
 fn: function (aMethod){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-
-    	smalltalk.removeMethod(aMethod)
-		smalltalk.init(self);
-    ;
-;
+_st(self)._basicRemoveCompiledMethod_(aMethod);
 $1=_st((smalltalk.MethodRemoved || MethodRemoved))._new();
 _st($1)._theClass_(self);
 _st($1)._method_(aMethod);
@@ -855,22 +875,49 @@ return self}, self, "addSubclassOf:named:instanceVariableNames:package:", [aClas
 smalltalk.ClassBuilder);
 
 smalltalk.addMethod(
-"_class_instanceVariableNames_",
+"_basicClass_instanceVariableNames_",
 smalltalk.method({
-selector: "class:instanceVariableNames:",
+selector: "basicClass:instanceVariableNames:",
 fn: function (aClass,aString){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3;
+return smalltalk.withContext(function($ctx1) { 
var $1;
 $1=_st(aClass)._isMetaclass();
 if(! smalltalk.assert($1)){
 _st(self)._error_(_st(_st(aClass)._name()).__comma(" is not a metaclass"));
 };
 _st(aClass)._basicAt_put_("iVarNames",_st(self)._instanceVariableNamesFor_(aString));
-$2=_st((smalltalk.ClassDefinitionChanged || ClassDefinitionChanged))._new();
-_st($2)._theClass_(aClass);
-$3=_st($2)._yourself();
-_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($3);
 _st(self)._setupClass_(aClass);
+return self}, self, "basicClass:instanceVariableNames:", [aClass,aString], smalltalk.ClassBuilder)}
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+"_basicRenameClass_to_",
+smalltalk.method({
+selector: "basicRenameClass:to:",
+fn: function (aClass,aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+		smalltalk[aString] = aClass;
+		delete smalltalk[aClass.className];
+		aClass.className = aString;
+	;
+return self}, self, "basicRenameClass:to:", [aClass,aString], smalltalk.ClassBuilder)}
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+"_class_instanceVariableNames_",
+smalltalk.method({
+selector: "class:instanceVariableNames:",
+fn: function (aClass,aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+_st(self)._basicClass_instanceVariableNames_(aClass,aString);
+$1=_st((smalltalk.ClassDefinitionChanged || ClassDefinitionChanged))._new();
+_st($1)._theClass_(aClass);
+$2=_st($1)._yourself();
+_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
 return self}, self, "class:instanceVariableNames:", [aClass,aString], smalltalk.ClassBuilder)}
 }),
 smalltalk.ClassBuilder);
@@ -918,12 +965,7 @@ selector: "renameClass:to:",
 fn: function (aClass,aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-
-		smalltalk[aString] = aClass;
-		delete smalltalk[aClass.className];
-		aClass.className = aString;
-	;
-;
+_st(self)._basicRenameClass_to_(aClass,aString);
 $1=_st((smalltalk.ClassRenamed || ClassRenamed))._new();
 _st($1)._theClass_(aClass);
 $2=_st($1)._yourself();

+ 92 - 30
js/Kernel-Classes.js

@@ -9,8 +9,7 @@ category: 'compiling',
 fn: function (aMethod){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
-;
+_st(self)._basicAddCompiledMethod_(aMethod);
 $1=_st((smalltalk.MethodAdded || MethodAdded))._new();
 _st($1)._theClass_(self);
 _st($1)._method_(aMethod);
@@ -18,8 +17,8 @@ $2=_st($1)._yourself();
 _st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
 return self}, self, "addCompiledMethod:", [aMethod], smalltalk.Behavior)},
 args: ["aMethod"],
-source: "addCompiledMethod: aMethod\x0a\x09<smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self)>.\x0a    \x0a    SystemAnnouncer current\x0a   \x09\x09announce: (MethodAdded new\x0a        \x09theClass: self;\x0a            method: aMethod;\x0a            yourself)",
-messageSends: ["announce:", "theClass:", "new", "method:", "yourself", "current"],
+source: "addCompiledMethod: aMethod\x0a\x09self basicAddCompiledMethod: aMethod.\x0a    \x0a    SystemAnnouncer current\x0a   \x09\x09announce: (MethodAdded new\x0a        \x09theClass: self;\x0a            method: aMethod;\x0a            yourself)",
+messageSends: ["basicAddCompiledMethod:", "announce:", "theClass:", "new", "method:", "yourself", "current"],
 referencedClasses: ["MethodAdded", "SystemAnnouncer"]
 }),
 smalltalk.Behavior);
@@ -97,6 +96,22 @@ referencedClasses: ["OrderedCollection"]
 }),
 smalltalk.Behavior);
 
+smalltalk.addMethod(
+"_basicAddCompiledMethod_",
+smalltalk.method({
+selector: "basicAddCompiledMethod:",
+category: 'private',
+fn: function (aMethod){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self);
+return self}, self, "basicAddCompiledMethod:", [aMethod], smalltalk.Behavior)},
+args: ["aMethod"],
+source: "basicAddCompiledMethod: aMethod\x0a\x09<smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self)>",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Behavior);
+
 smalltalk.addMethod(
 "_basicNew",
 smalltalk.method({
@@ -114,6 +129,25 @@ referencedClasses: []
 }),
 smalltalk.Behavior);
 
+smalltalk.addMethod(
+"_basicRemoveCompiledMethod_",
+smalltalk.method({
+selector: "basicRemoveCompiledMethod:",
+category: 'private',
+fn: function (aMethod){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+    	smalltalk.removeMethod(aMethod)
+		smalltalk.init(self);
+    ;
+return self}, self, "basicRemoveCompiledMethod:", [aMethod], smalltalk.Behavior)},
+args: ["aMethod"],
+source: "basicRemoveCompiledMethod: aMethod\x0a\x09<\x0a    \x09smalltalk.removeMethod(aMethod)\x0a\x09\x09smalltalk.init(self);\x0a    >",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Behavior);
+
 smalltalk.addMethod(
 "_canUnderstand_",
 smalltalk.method({
@@ -594,11 +628,7 @@ category: 'compiling',
 fn: function (aMethod){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-
-    	smalltalk.removeMethod(aMethod)
-		smalltalk.init(self);
-    ;
-;
+_st(self)._basicRemoveCompiledMethod_(aMethod);
 $1=_st((smalltalk.MethodRemoved || MethodRemoved))._new();
 _st($1)._theClass_(self);
 _st($1)._method_(aMethod);
@@ -606,8 +636,8 @@ $2=_st($1)._yourself();
 _st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
 return self}, self, "removeCompiledMethod:", [aMethod], smalltalk.Behavior)},
 args: ["aMethod"],
-source: "removeCompiledMethod: aMethod\x0a\x09<\x0a    \x09smalltalk.removeMethod(aMethod)\x0a\x09\x09smalltalk.init(self);\x0a    >.\x0a    \x0a    SystemAnnouncer current\x0a   \x09\x09announce: (MethodRemoved new\x0a        \x09theClass: self;\x0a            method: aMethod;\x0a            yourself)",
-messageSends: ["announce:", "theClass:", "new", "method:", "yourself", "current"],
+source: "removeCompiledMethod: aMethod\x0a\x09self basicRemoveCompiledMethod: aMethod.\x0a    \x0a    SystemAnnouncer current\x0a   \x09\x09announce: (MethodRemoved new\x0a        \x09theClass: self;\x0a            method: aMethod;\x0a            yourself)",
+messageSends: ["basicRemoveCompiledMethod:", "announce:", "theClass:", "new", "method:", "yourself", "current"],
 referencedClasses: ["MethodRemoved", "SystemAnnouncer"]
 }),
 smalltalk.Behavior);
@@ -1149,27 +1179,64 @@ referencedClasses: []
 smalltalk.ClassBuilder);
 
 smalltalk.addMethod(
-"_class_instanceVariableNames_",
+"_basicClass_instanceVariableNames_",
 smalltalk.method({
-selector: "class:instanceVariableNames:",
-category: 'class creation',
+selector: "basicClass:instanceVariableNames:",
+category: 'private',
 fn: function (aClass,aString){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3;
+return smalltalk.withContext(function($ctx1) { 
var $1;
 $1=_st(aClass)._isMetaclass();
 if(! smalltalk.assert($1)){
 _st(self)._error_(_st(_st(aClass)._name()).__comma(" is not a metaclass"));
 };
 _st(aClass)._basicAt_put_("iVarNames",_st(self)._instanceVariableNamesFor_(aString));
-$2=_st((smalltalk.ClassDefinitionChanged || ClassDefinitionChanged))._new();
-_st($2)._theClass_(aClass);
-$3=_st($2)._yourself();
-_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($3);
 _st(self)._setupClass_(aClass);
+return self}, self, "basicClass:instanceVariableNames:", [aClass,aString], smalltalk.ClassBuilder)},
+args: ["aClass", "aString"],
+source: "basicClass: aClass instanceVariableNames: aString\x0a\x09aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].\x0a\x09aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).\x0a    \x0a\x09self setupClass: aClass",
+messageSends: ["ifFalse:", "error:", ",", "name", "isMetaclass", "basicAt:put:", "instanceVariableNamesFor:", "setupClass:"],
+referencedClasses: []
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+"_basicRenameClass_to_",
+smalltalk.method({
+selector: "basicRenameClass:to:",
+category: 'private',
+fn: function (aClass,aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+		smalltalk[aString] = aClass;
+		delete smalltalk[aClass.className];
+		aClass.className = aString;
+	;
+return self}, self, "basicRenameClass:to:", [aClass,aString], smalltalk.ClassBuilder)},
+args: ["aClass", "aString"],
+source: "basicRenameClass: aClass to: aString\x0a\x09<\x0a\x09\x09smalltalk[aString] = aClass;\x0a\x09\x09delete smalltalk[aClass.className];\x0a\x09\x09aClass.className = aString;\x0a\x09>",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+"_class_instanceVariableNames_",
+smalltalk.method({
+selector: "class:instanceVariableNames:",
+category: 'class creation',
+fn: function (aClass,aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+_st(self)._basicClass_instanceVariableNames_(aClass,aString);
+$1=_st((smalltalk.ClassDefinitionChanged || ClassDefinitionChanged))._new();
+_st($1)._theClass_(aClass);
+$2=_st($1)._yourself();
+_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
 return self}, self, "class:instanceVariableNames:", [aClass,aString], smalltalk.ClassBuilder)},
 args: ["aClass", "aString"],
-source: "class: aClass instanceVariableNames: aString\x0a\x09aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].\x0a\x09aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).\x0a    \x0a    SystemAnnouncer current\x0a    \x09announce: (ClassDefinitionChanged new\x0a        \x09theClass: aClass;\x0a            yourself).\x0a    \x0a\x09self setupClass: aClass",
-messageSends: ["ifFalse:", "error:", ",", "name", "isMetaclass", "basicAt:put:", "instanceVariableNamesFor:", "announce:", "theClass:", "new", "yourself", "current", "setupClass:"],
+source: "class: aClass instanceVariableNames: aString\x0a\x09self basicClass: aClass instanceVariableNames: aString.\x0a    \x0a    SystemAnnouncer current\x0a    \x09announce: (ClassDefinitionChanged new\x0a        \x09theClass: aClass;\x0a            yourself)",
+messageSends: ["basicClass:instanceVariableNames:", "announce:", "theClass:", "new", "yourself", "current"],
 referencedClasses: ["ClassDefinitionChanged", "SystemAnnouncer"]
 }),
 smalltalk.ClassBuilder);
@@ -1228,20 +1295,15 @@ category: 'class creation',
 fn: function (aClass,aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-
-		smalltalk[aString] = aClass;
-		delete smalltalk[aClass.className];
-		aClass.className = aString;
-	;
-;
+_st(self)._basicRenameClass_to_(aClass,aString);
 $1=_st((smalltalk.ClassRenamed || ClassRenamed))._new();
 _st($1)._theClass_(aClass);
 $2=_st($1)._yourself();
 _st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
 return self}, self, "renameClass:to:", [aClass,aString], smalltalk.ClassBuilder)},
 args: ["aClass", "aString"],
-source: "renameClass: aClass to: aString\x0a\x09<\x0a\x09\x09smalltalk[aString] = aClass;\x0a\x09\x09delete smalltalk[aClass.className];\x0a\x09\x09aClass.className = aString;\x0a\x09>.\x0a    \x0a    SystemAnnouncer current\x0a    \x09announce: (ClassRenamed new\x0a        \x09theClass: aClass;\x0a            yourself)\x0a    \x09",
-messageSends: ["announce:", "theClass:", "new", "yourself", "current"],
+source: "renameClass: aClass to: aString\x0a\x09self basicRenameClass: aClass to: aString.\x0a    \x0a    SystemAnnouncer current\x0a    \x09announce: (ClassRenamed new\x0a        \x09theClass: aClass;\x0a            yourself)\x0a    \x09",
+messageSends: ["basicRenameClass:to:", "announce:", "theClass:", "new", "yourself", "current"],
 referencedClasses: ["ClassRenamed", "SystemAnnouncer"]
 }),
 smalltalk.ClassBuilder);
@@ -1250,7 +1312,7 @@ smalltalk.addMethod(
 "_setupClass_",
 smalltalk.method({
 selector: "setupClass:",
-category: 'private',
+category: 'class creation',
 fn: function (aClass){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
smalltalk.init(aClass);;

+ 8 - 10
js/Kernel-Collections.deploy.js

@@ -1817,10 +1817,9 @@ return smalltalk.withContext(function($ctx1) {
 				self.splice(i,1);
 				return self;
 			}
-		}
+		};
+        aBlock._value();
 	;
-;
-_st(aBlock)._value();
 return self}, self, "remove:ifAbsent:", [anObject,aBlock], smalltalk.Array)}
 }),
 smalltalk.Array);
@@ -2193,13 +2192,12 @@ smalltalk.method({
 selector: "=",
 fn: function (aString){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(aString)._class()).__eq(_st(self)._class());
-if(! smalltalk.assert($1)){
-return false;
-};
-return String(self) === String(aString);
-;
+return smalltalk.withContext(function($ctx1) { 
+    	if(! aString._isString || ! aString._isString()) {
+        	return false;
+        }
+    	return String(self) === String(aString)
+    ;
 return self}, self, "=", [aString], smalltalk.String)}
 }),
 smalltalk.String);

+ 12 - 14
js/Kernel-Collections.js

@@ -2424,14 +2424,13 @@ return smalltalk.withContext(function($ctx1) {
 				self.splice(i,1);
 				return self;
 			}
-		}
+		};
+        aBlock._value();
 	;
-;
-_st(aBlock)._value();
 return self}, self, "remove:ifAbsent:", [anObject,aBlock], smalltalk.Array)},
 args: ["anObject", "aBlock"],
-source: "remove: anObject ifAbsent: aBlock\x0a\x09<\x0a\x09\x09for(var i=0;i<self.length;i++) {\x0a\x09\x09\x09if(self[i] == anObject) {\x0a\x09\x09\x09\x09self.splice(i,1);\x0a\x09\x09\x09\x09return self;\x0a\x09\x09\x09}\x0a\x09\x09}\x0a\x09>.\x0a\x09aBlock value",
-messageSends: ["value"],
+source: "remove: anObject ifAbsent: aBlock\x0a\x09<\x0a\x09\x09for(var i=0;i<self.length;i++) {\x0a\x09\x09\x09if(self[i] == anObject) {\x0a\x09\x09\x09\x09self.splice(i,1);\x0a\x09\x09\x09\x09return self;\x0a\x09\x09\x09}\x0a\x09\x09};\x0a        aBlock._value();\x0a\x09>",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Array);
@@ -2940,17 +2939,16 @@ selector: "=",
 category: 'comparing',
 fn: function (aString){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(aString)._class()).__eq(_st(self)._class());
-if(! smalltalk.assert($1)){
-return false;
-};
-return String(self) === String(aString);
-;
+return smalltalk.withContext(function($ctx1) { 
+    	if(! aString._isString || ! aString._isString()) {
+        	return false;
+        }
+    	return String(self) === String(aString)
+    ;
 return self}, self, "=", [aString], smalltalk.String)},
 args: ["aString"],
-source: "= aString\x0a\x09aString class = self class ifFalse: [^false].\x0a\x09<return String(self) === String(aString)>",
-messageSends: ["ifFalse:", "=", "class"],
+source: "= aString\x0a\x09<\x0a    \x09if(! aString._isString || ! aString._isString()) {\x0a        \x09return false;\x0a        }\x0a    \x09return String(self) === String(aString)\x0a    >",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.String);

+ 103 - 76
js/Kernel-Objects.deploy.js

@@ -350,6 +350,17 @@ return self}, self, "instVarAt:put:", [aSymbol,anObject], smalltalk.Object)}
 }),
 smalltalk.Object);
 
+smalltalk.addMethod(
+"_isBoolean",
+smalltalk.method({
+selector: "isBoolean",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return false;
+}, self, "isBoolean", [], smalltalk.Object)}
+}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 "_isClass",
 smalltalk.method({
@@ -669,9 +680,8 @@ smalltalk.method({
 selector: "value",
 fn: function (){
 var self=this;
-return self.valueOf();
-;
-return self}
+return smalltalk.withContext(function($ctx1) { 
return self;
+}, self, "value", [], smalltalk.Object)}
 }),
 smalltalk.Object);
 
@@ -749,13 +759,12 @@ smalltalk.method({
 selector: "=",
 fn: function (aBoolean){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(aBoolean)._class()).__eq(_st(self)._class());
-if(! smalltalk.assert($1)){
-return false;
-};
-return Boolean(self == true) == aBoolean;
-;
+return smalltalk.withContext(function($ctx1) { 
+    	if(! aBoolean._isBoolean || ! aBoolean._isBoolean()) {
+        	return false;
+        }
+    	return Boolean(self == true) == aBoolean
+    ;
 return self}, self, "=", [aBoolean], smalltalk.Boolean)}
 }),
 smalltalk.Boolean);
@@ -870,6 +879,17 @@ return self}, self, "ifTrue:ifFalse:", [aBlock,anotherBlock], smalltalk.Boolean)
 }),
 smalltalk.Boolean);
 
+smalltalk.addMethod(
+"_isBoolean",
+smalltalk.method({
+selector: "isBoolean",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, self, "isBoolean", [], smalltalk.Boolean)}
+}),
+smalltalk.Boolean);
+
 smalltalk.addMethod(
 "_not",
 smalltalk.method({
@@ -1631,10 +1651,11 @@ smalltalk.method({
 selector: "addObjectVariablesTo:",
 fn: function (aDictionary){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
for(var i in self['@jsObject']) {
-		aDictionary._at_put_(i, self['@jsObject'][i]);
-	};
-;
+return smalltalk.withContext(function($ctx1) { 
+    	for(var i in self['@jsObject']) {
+			aDictionary._at_put_(i, self['@jsObject'][i]);
+		}
+    ;
 return self}, self, "addObjectVariablesTo:", [aDictionary], smalltalk.JSObjectProxy)}
 }),
 smalltalk.JSObjectProxy);
@@ -1664,21 +1685,52 @@ return self}, self, "at:put:", [aSymbol,anObject], smalltalk.JSObjectProxy)}
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-"_doesNotUnderstand_",
+"_canForwardMessage_",
 smalltalk.method({
-selector: "doesNotUnderstand:",
+selector: "canForwardMessage:",
 fn: function (aMessage){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
     	var jsSelector = aMessage._selector()._asJavaScriptSelector();
-        var object = self._jsObject();
-    	if(jsSelector in object) {
-        	return smalltalk.send(object, jsSelector, aMessage._arguments());
+    	if(jsSelector in self._jsObject()) {
+        	return true
+        } else {
+        	return false;
         }
     ;
-;
-smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
-return self}, self, "doesNotUnderstand:", [aMessage], smalltalk.JSObjectProxy)}
+return self}, self, "canForwardMessage:", [aMessage], smalltalk.JSObjectProxy)}
+}),
+smalltalk.JSObjectProxy);
+
+smalltalk.addMethod(
+"_doesNotUnderstand_",
+smalltalk.method({
+selector: "doesNotUnderstand:",
+fn: function (aMessage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$3,$1;
+$2=_st(self)._canForwardMessage_(aMessage);
+if(smalltalk.assert($2)){
+$1=_st(self)._forwardMessage_(aMessage);
+} else {
+$3=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
+return $3;
+};
+return $1;
+}, self, "doesNotUnderstand:", [aMessage], smalltalk.JSObjectProxy)}
+}),
+smalltalk.JSObjectProxy);
+
+smalltalk.addMethod(
+"_forwardMessage_",
+smalltalk.method({
+selector: "forwardMessage:",
+fn: function (aMessage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+    	return smalltalk.send(self._jsObject(), aMessage._selector()._asJavaScriptSelector(), aMessage._arguments());
+    ;
+return self}, self, "forwardMessage:", [aMessage], smalltalk.JSObjectProxy)}
 }),
 smalltalk.JSObjectProxy);
 
@@ -1858,13 +1910,12 @@ smalltalk.method({
 selector: "=",
 fn: function (aNumber){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(aNumber)._isNumber();
-if(! smalltalk.assert($1)){
-return false;
-};
-return Number(self) == aNumber;
-;
+return smalltalk.withContext(function($ctx1) { 
+    	if(! aNumber._isNumber || ! aNumber._isNumber()) {
+        	return false;
+        }
+    	return Number(self) == aNumber
+    ;
 return self}, self, "=", [aNumber], smalltalk.Number)}
 }),
 smalltalk.Number);
@@ -1936,11 +1987,8 @@ smalltalk.method({
 selector: "abs",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=Math.abs(self);;
-;
-return $1;
-}, self, "abs", [], smalltalk.Number)}
+return smalltalk.withContext(function($ctx1) { 
return Math.abs(self);;
+return self}, self, "abs", [], smalltalk.Number)}
 }),
 smalltalk.Number);
 
@@ -2710,6 +2758,24 @@ return self}, self, "propertyAt:put:", [key,value], smalltalk.Package)}
 }),
 smalltalk.Package);
 
+smalltalk.addMethod(
+"_setupClasses",
+smalltalk.method({
+selector: "setupClasses",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=_st(self)._classes();
+_st($1)._do_((function(each){
+return smalltalk.withContext(function($ctx2) { 
return _st(_st((smalltalk.ClassBuilder || ClassBuilder))._new())._setupClass_(each);
+})}));
+$2=_st($1)._do_((function(each){
+return smalltalk.withContext(function($ctx2) { 
return _st(each)._initialize();
+})}));
+return self}, self, "setupClasses", [], smalltalk.Package)}
+}),
+smalltalk.Package);
+
 smalltalk.addMethod(
 "_sortedClasses",
 smalltalk.method({
@@ -2725,22 +2791,6 @@ smalltalk.Package);
 
 
 smalltalk.Package.klass.iVarNames = ['defaultCommitPathJs','defaultCommitPathSt'];
-smalltalk.addMethod(
-"_commitToLocalStorage_",
-smalltalk.method({
-selector: "commitToLocalStorage:",
-fn: function (aPackageName){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
$ctx1.key=nil;
-$ctx1.sourceCode=nil;
-$ctx1.locals.key=_st("smalltalk.packages.").__comma(aPackageName);
-$ctx1.locals.sourceCode=_st(_st((smalltalk.Exporter || Exporter))._new())._exportPackage_(aPackageName);
-localStorage[key] = escape(sourceCode);
-;
-return self}, self, "commitToLocalStorage:", [aPackageName], smalltalk.Package.klass)}
-}),
-smalltalk.Package.klass);
-
 smalltalk.addMethod(
 "_defaultCommitPathJs",
 smalltalk.method({
@@ -2817,34 +2867,12 @@ selector: "fetch:prefix:",
 fn: function (aPackageName,aPrefix){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(jQuery)._getScript_onSuccess_(_st(_st(aPrefix).__comma(aPackageName)).__comma(".js"),(function(){
-return smalltalk.withContext(function($ctx2) { 
return _st((smalltalk.Package || Package))._init_(aPackageName);
+return smalltalk.withContext(function($ctx2) { 
return _st(_st((smalltalk.Package || Package))._named_(aPackageName))._setupClasses();
 })}));
 return self}, self, "fetch:prefix:", [aPackageName,aPrefix], smalltalk.Package.klass)}
 }),
 smalltalk.Package.klass);
 
-smalltalk.addMethod(
-"_init_",
-smalltalk.method({
-selector: "init:",
-fn: function (aPackageName){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-$1=_st(_st(smalltalk)._classes())._select_((function(each){
-return smalltalk.withContext(function($ctx2) { 
return each.pkg.pkgName == aPackageName;
-;
-})}));
-_st($1)._do_((function(each){
-return smalltalk.withContext(function($ctx2) { 
return smalltalk.init(each);
-;
-})}));
-$2=_st($1)._do_((function(each){
-return smalltalk.withContext(function($ctx2) { 
return _st(each)._initialize();
-})}));
-return self}, self, "init:", [aPackageName], smalltalk.Package.klass)}
-}),
-smalltalk.Package.klass);
-
 smalltalk.addMethod(
 "_named_",
 smalltalk.method({
@@ -3343,7 +3371,7 @@ selector: "renamePackage:to:",
 fn: function (packageName,newName){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$ctx1.pkg=nil;
+$ctx1.locals.pkg=nil;
 $ctx1.locals.pkg=_st(self)._packageAt_ifAbsent_(packageName,(function(){
 return smalltalk.withContext(function($ctx2) { 
return _st(self)._error_(_st("Missing package: ").__comma(packageName));
 })}));
@@ -3353,8 +3381,7 @@ $1;
 } else {
 _st(self)._error_(_st("Already exists a package called: ").__comma(newName));
 };
-smalltalk.packages[newName] = smalltalk.packages[packageName];
-;
+_st(_st(self)._basicAt_("packages"))._at_put_(newName,$ctx1.locals.pkg);
 _st($ctx1.locals.pkg)._name_(newName);
 _st(self)._deletePackage_(packageName);
 return self}, self, "renamePackage:to:", [packageName,newName], smalltalk.Smalltalk)}

+ 141 - 98
js/Kernel-Objects.js

@@ -486,6 +486,22 @@ referencedClasses: []
 }),
 smalltalk.Object);
 
+smalltalk.addMethod(
+"_isBoolean",
+smalltalk.method({
+selector: "isBoolean",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return false;
+}, self, "isBoolean", [], smalltalk.Object)},
+args: [],
+source: "isBoolean\x0a\x09^ false",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 "_isClass",
 smalltalk.method({
@@ -1041,17 +1057,16 @@ selector: "=",
 category: 'comparing',
 fn: function (aBoolean){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(aBoolean)._class()).__eq(_st(self)._class());
-if(! smalltalk.assert($1)){
-return false;
-};
-return Boolean(self == true) == aBoolean;
-;
+return smalltalk.withContext(function($ctx1) { 
+    	if(! aBoolean._isBoolean || ! aBoolean._isBoolean()) {
+        	return false;
+        }
+    	return Boolean(self == true) == aBoolean
+    ;
 return self}, self, "=", [aBoolean], smalltalk.Boolean)},
 args: ["aBoolean"],
-source: "= aBoolean\x0a\x09aBoolean class = self class ifFalse: [^false].\x0a\x09<return Boolean(self == true) == aBoolean>",
-messageSends: ["ifFalse:", "=", "class"],
+source: "= aBoolean\x0a\x09<\x0a    \x09if(! aBoolean._isBoolean || ! aBoolean._isBoolean()) {\x0a        \x09return false;\x0a        }\x0a    \x09return Boolean(self == true) == aBoolean\x0a    >",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Boolean);
@@ -1206,6 +1221,22 @@ referencedClasses: []
 }),
 smalltalk.Boolean);
 
+smalltalk.addMethod(
+"_isBoolean",
+smalltalk.method({
+selector: "isBoolean",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, self, "isBoolean", [], smalltalk.Boolean)},
+args: [],
+source: "isBoolean\x0a\x09^ true",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Boolean);
+
 smalltalk.addMethod(
 "_not",
 smalltalk.method({
@@ -2261,13 +2292,14 @@ selector: "addObjectVariablesTo:",
 category: 'proxy',
 fn: function (aDictionary){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
for(var i in self['@jsObject']) {
-		aDictionary._at_put_(i, self['@jsObject'][i]);
-	};
-;
+return smalltalk.withContext(function($ctx1) { 
+    	for(var i in self['@jsObject']) {
+			aDictionary._at_put_(i, self['@jsObject'][i]);
+		}
+    ;
 return self}, self, "addObjectVariablesTo:", [aDictionary], smalltalk.JSObjectProxy)},
 args: ["aDictionary"],
-source: "addObjectVariablesTo: aDictionary\x0a\x09<for(var i in self['@jsObject']) {\x0a\x09\x09aDictionary._at_put_(i, self['@jsObject'][i]);\x0a\x09}>.",
+source: "addObjectVariablesTo: aDictionary\x0a\x09<\x0a    \x09for(var i in self['@jsObject']) {\x0a\x09\x09\x09aDictionary._at_put_(i, self['@jsObject'][i]);\x0a\x09\x09}\x0a    >",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2307,6 +2339,29 @@ referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_canForwardMessage_",
+smalltalk.method({
+selector: "canForwardMessage:",
+category: 'testing',
+fn: function (aMessage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+    	var jsSelector = aMessage._selector()._asJavaScriptSelector();
+    	if(jsSelector in self._jsObject()) {
+        	return true
+        } else {
+        	return false;
+        }
+    ;
+return self}, self, "canForwardMessage:", [aMessage], smalltalk.JSObjectProxy)},
+args: ["aMessage"],
+source: "canForwardMessage: aMessage\x0a\x09<\x0a    \x09var jsSelector = aMessage._selector()._asJavaScriptSelector();\x0a    \x09if(jsSelector in self._jsObject()) {\x0a        \x09return true\x0a        } else {\x0a        \x09return false;\x0a        }\x0a    >",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_doesNotUnderstand_",
 smalltalk.method({
@@ -2314,19 +2369,37 @@ selector: "doesNotUnderstand:",
 category: 'proxy',
 fn: function (aMessage){
 var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$3,$1;
+$2=_st(self)._canForwardMessage_(aMessage);
+if(smalltalk.assert($2)){
+$1=_st(self)._forwardMessage_(aMessage);
+} else {
+$3=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
+return $3;
+};
+return $1;
+}, self, "doesNotUnderstand:", [aMessage], smalltalk.JSObjectProxy)},
+args: ["aMessage"],
+source: "doesNotUnderstand: aMessage\x0a    \x0a   ^ (self canForwardMessage: aMessage) \x0a    \x09ifTrue: [ self forwardMessage: aMessage ]\x0a        ifFalse: [ ^ super doesNotUnderstand: aMessage ]\x0a    ",
+messageSends: ["ifTrue:ifFalse:", "forwardMessage:", "doesNotUnderstand:", "canForwardMessage:"],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
+smalltalk.addMethod(
+"_forwardMessage_",
+smalltalk.method({
+selector: "forwardMessage:",
+category: 'proxy',
+fn: function (aMessage){
+var self=this;
 return smalltalk.withContext(function($ctx1) { 
-    	var jsSelector = aMessage._selector()._asJavaScriptSelector();
-        var object = self._jsObject();
-    	if(jsSelector in object) {
-        	return smalltalk.send(object, jsSelector, aMessage._arguments());
-        }
+    	return smalltalk.send(self._jsObject(), aMessage._selector()._asJavaScriptSelector(), aMessage._arguments());
     ;
-;
-smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
-return self}, self, "doesNotUnderstand:", [aMessage], smalltalk.JSObjectProxy)},
+return self}, self, "forwardMessage:", [aMessage], smalltalk.JSObjectProxy)},
 args: ["aMessage"],
-source: "doesNotUnderstand: aMessage\x0a\x09<\x0a    \x09var jsSelector = aMessage._selector()._asJavaScriptSelector();\x0a        var object = self._jsObject();\x0a    \x09if(jsSelector in object) {\x0a        \x09return smalltalk.send(object, jsSelector, aMessage._arguments());\x0a        }\x0a    >.\x0a    \x0a\x09super doesNotUnderstand: aMessage",
-messageSends: ["doesNotUnderstand:"],
+source: "forwardMessage: aMessage\x0a\x09<\x0a    \x09return smalltalk.send(self._jsObject(), aMessage._selector()._asJavaScriptSelector(), aMessage._arguments());\x0a    >",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
@@ -2574,17 +2647,16 @@ selector: "=",
 category: 'comparing',
 fn: function (aNumber){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(aNumber)._isNumber();
-if(! smalltalk.assert($1)){
-return false;
-};
-return Number(self) == aNumber;
-;
+return smalltalk.withContext(function($ctx1) { 
+    	if(! aNumber._isNumber || ! aNumber._isNumber()) {
+        	return false;
+        }
+    	return Number(self) == aNumber
+    ;
 return self}, self, "=", [aNumber], smalltalk.Number)},
 args: ["aNumber"],
-source: "= aNumber\x0a\x09aNumber isNumber ifFalse: [^false]. \x0a\x09<return Number(self) == aNumber>",
-messageSends: ["ifFalse:", "isNumber"],
+source: "= aNumber\x0a\x09<\x0a    \x09if(! aNumber._isNumber || ! aNumber._isNumber()) {\x0a        \x09return false;\x0a        }\x0a    \x09return Number(self) == aNumber\x0a    >",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Number);
@@ -2682,13 +2754,10 @@ selector: "abs",
 category: 'arithmetic',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=Math.abs(self);;
-;
-return $1;
-}, self, "abs", [], smalltalk.Number)},
+return smalltalk.withContext(function($ctx1) { 
return Math.abs(self);;
+return self}, self, "abs", [], smalltalk.Number)},
 args: [],
-source: "abs\x0a\x09^ <Math.abs(self);>",
+source: "abs\x0a\x09<return Math.abs(self);>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -3726,6 +3795,29 @@ referencedClasses: []
 }),
 smalltalk.Package);
 
+smalltalk.addMethod(
+"_setupClasses",
+smalltalk.method({
+selector: "setupClasses",
+category: 'classes',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=_st(self)._classes();
+_st($1)._do_((function(each){
+return smalltalk.withContext(function($ctx2) { 
return _st(_st((smalltalk.ClassBuilder || ClassBuilder))._new())._setupClass_(each);
+})}));
+$2=_st($1)._do_((function(each){
+return smalltalk.withContext(function($ctx2) { 
return _st(each)._initialize();
+})}));
+return self}, self, "setupClasses", [], smalltalk.Package)},
+args: [],
+source: "setupClasses\x0a\x09self classes\x0a\x09\x09do: [ :each | ClassBuilder new setupClass: each ];\x0a\x09\x09do: [ :each | each initialize ]",
+messageSends: ["do:", "setupClass:", "new", "classes", "initialize"],
+referencedClasses: ["ClassBuilder"]
+}),
+smalltalk.Package);
+
 smalltalk.addMethod(
 "_sortedClasses",
 smalltalk.method({
@@ -3746,27 +3838,6 @@ smalltalk.Package);
 
 
 smalltalk.Package.klass.iVarNames = ['defaultCommitPathJs','defaultCommitPathSt'];
-smalltalk.addMethod(
-"_commitToLocalStorage_",
-smalltalk.method({
-selector: "commitToLocalStorage:",
-category: 'loading-storing',
-fn: function (aPackageName){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
$ctx1.key=nil;
-$ctx1.sourceCode=nil;
-$ctx1.locals.key=_st("smalltalk.packages.").__comma(aPackageName);
-$ctx1.locals.sourceCode=_st(_st((smalltalk.Exporter || Exporter))._new())._exportPackage_(aPackageName);
-localStorage[key] = escape(sourceCode);
-;
-return self}, self, "commitToLocalStorage:", [aPackageName], smalltalk.Package.klass)},
-args: ["aPackageName"],
-source: "commitToLocalStorage: aPackageName\x0a\x09| key sourceCode |\x0a\x09key := 'smalltalk.packages.' , aPackageName.\x0a\x09sourceCode := Exporter new exportPackage: aPackageName.\x0a\x09<localStorage[key] = escape(sourceCode)>",
-messageSends: [",", "exportPackage:", "new"],
-referencedClasses: ["Exporter"]
-}),
-smalltalk.Package.klass);
-
 smalltalk.addMethod(
 "_defaultCommitPathJs",
 smalltalk.method({
@@ -3869,48 +3940,21 @@ category: 'loading-storing',
 fn: function (aPackageName,aPrefix){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(jQuery)._getScript_onSuccess_(_st(_st(aPrefix).__comma(aPackageName)).__comma(".js"),(function(){
-return smalltalk.withContext(function($ctx2) { 
return _st((smalltalk.Package || Package))._init_(aPackageName);
+return smalltalk.withContext(function($ctx2) { 
return _st(_st((smalltalk.Package || Package))._named_(aPackageName))._setupClasses();
 })}));
 return self}, self, "fetch:prefix:", [aPackageName,aPrefix], smalltalk.Package.klass)},
 args: ["aPackageName", "aPrefix"],
-source: "fetch: aPackageName prefix: aPrefix\x0a\x09jQuery getScript: (aPrefix , aPackageName , '.js') onSuccess: [ Package init: aPackageName ]",
-messageSends: ["getScript:onSuccess:", ",", "init:"],
+source: "fetch: aPackageName prefix: aPrefix\x0a\x09jQuery \x0a    \x09getScript: (aPrefix , aPackageName , '.js') \x0a        onSuccess: [ \x0a        \x09(Package named: aPackageName) setupClasses ]",
+messageSends: ["getScript:onSuccess:", ",", "setupClasses", "named:"],
 referencedClasses: ["Package"]
 }),
 smalltalk.Package.klass);
 
-smalltalk.addMethod(
-"_init_",
-smalltalk.method({
-selector: "init:",
-category: 'loading-storing',
-fn: function (aPackageName){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-$1=_st(_st(smalltalk)._classes())._select_((function(each){
-return smalltalk.withContext(function($ctx2) { 
return each.pkg.pkgName == aPackageName;
-;
-})}));
-_st($1)._do_((function(each){
-return smalltalk.withContext(function($ctx2) { 
return smalltalk.init(each);
-;
-})}));
-$2=_st($1)._do_((function(each){
-return smalltalk.withContext(function($ctx2) { 
return _st(each)._initialize();
-})}));
-return self}, self, "init:", [aPackageName], smalltalk.Package.klass)},
-args: ["aPackageName"],
-source: "init: aPackageName\x0a\x09(smalltalk classes select: [ :each | <each.pkg.pkgName == aPackageName> ])\x0a\x09\x09do: [ :each | <smalltalk.init(each)> ];\x0a\x09\x09do: [ :each | each initialize ]",
-messageSends: ["do:", "select:", "classes", "initialize"],
-referencedClasses: []
-}),
-smalltalk.Package.klass);
-
 smalltalk.addMethod(
 "_named_",
 smalltalk.method({
 selector: "named:",
-category: 'not yet classified',
+category: 'accessing',
 fn: function (aPackageName){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
@@ -3928,7 +3972,7 @@ smalltalk.addMethod(
 "_named_ifAbsent_",
 smalltalk.method({
 selector: "named:ifAbsent:",
-category: 'not yet classified',
+category: 'accessing',
 fn: function (aPackageName,aBlock){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
@@ -4308,7 +4352,7 @@ smalltalk.addMethod(
 "_basicParse_",
 smalltalk.method({
 selector: "basicParse:",
-category: 'accessing',
+category: 'private',
 fn: function (aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return smalltalk.parser.parse(aString);
@@ -4578,7 +4622,7 @@ category: 'packages',
 fn: function (packageName,newName){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$ctx1.pkg=nil;
+$ctx1.locals.pkg=nil;
 $ctx1.locals.pkg=_st(self)._packageAt_ifAbsent_(packageName,(function(){
 return smalltalk.withContext(function($ctx2) { 
return _st(self)._error_(_st("Missing package: ").__comma(packageName));
 })}));
@@ -4588,14 +4632,13 @@ $1;
 } else {
 _st(self)._error_(_st("Already exists a package called: ").__comma(newName));
 };
-smalltalk.packages[newName] = smalltalk.packages[packageName];
-;
+_st(_st(self)._basicAt_("packages"))._at_put_(newName,$ctx1.locals.pkg);
 _st($ctx1.locals.pkg)._name_(newName);
 _st(self)._deletePackage_(packageName);
 return self}, self, "renamePackage:to:", [packageName,newName], smalltalk.Smalltalk)},
 args: ["packageName", "newName"],
-source: "renamePackage: packageName to: newName\x0a\x09\x22Rename a package.\x22\x0a\x0a\x09| pkg |\x0a\x09pkg := self packageAt: packageName ifAbsent: [self error: 'Missing package: ', packageName].\x0a\x09(self packageAt: newName) ifNotNil: [self error: 'Already exists a package called: ', newName].\x0a\x09<smalltalk.packages[newName] = smalltalk.packages[packageName]>.\x0a\x09pkg name: newName.\x0a\x09self deletePackage: packageName.",
-messageSends: ["packageAt:ifAbsent:", "error:", ",", "ifNotNil:", "packageAt:", "name:", "deletePackage:"],
+source: "renamePackage: packageName to: newName\x0a\x09\x22Rename a package.\x22\x0a\x0a\x09| pkg |\x0a\x09pkg := self packageAt: packageName ifAbsent: [self error: 'Missing package: ', packageName].\x0a\x09(self packageAt: newName) ifNotNil: [self error: 'Already exists a package called: ', newName].\x0a    (self basicAt: 'packages') at: newName put: pkg.\x0a\x09pkg name: newName.\x0a\x09self deletePackage: packageName.",
+messageSends: ["packageAt:ifAbsent:", "error:", ",", "ifNotNil:", "packageAt:", "at:put:", "basicAt:", "name:", "deletePackage:"],
 referencedClasses: []
 }),
 smalltalk.Smalltalk);

+ 60 - 57
js/Kernel-Tests.deploy.js

@@ -267,56 +267,72 @@ smalltalk.method({
 selector: "testIfTrueIfFalseWithBoxing",
 fn: function (){
 var self=this;
-var $2,$1,$4,$3,$6,$5,$8,$7,$10,$9,$12,$11,$14,$13,$16,$15;
-$2=smalltalk.send(true,"_boxed",[]);
-if(smalltalk.assert($2)){
-$1="alternative block";
-};
-smalltalk.send(self,"_assert_",[smalltalk.send($1,"__eq",["alternative block"])]);
-$4=smalltalk.send(true,"_boxed",[]);
-if(! smalltalk.assert($4)){
+return smalltalk.withContext(function($ctx1) { 
var $1,$4,$3,$2,$5,$8,$7,$6,$9,$12,$11,$10,$13,$16,$15,$14,$17,$20,$19,$18,$21,$24,$23,$22,$25,$28,$27,$26,$29,$32,$31,$30;
+$1=self;
+$4=_st(true)._yourself();
+if(smalltalk.assert($4)){
 $3="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($3,"__eq",[nil])]);
-$6=smalltalk.send(false,"_boxed",[]);
-if(smalltalk.assert($6)){
-$5="alternative block";
-};
-smalltalk.send(self,"_assert_",[smalltalk.send($5,"__eq",[nil])]);
-$8=smalltalk.send(false,"_boxed",[]);
+$2=_st($3).__eq("alternative block");
+_st($1)._assert_($2);
+$5=self;
+$8=_st(true)._yourself();
 if(! smalltalk.assert($8)){
 $7="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($7,"__eq",["alternative block"])]);
-$10=smalltalk.send(false,"_boxed",[]);
-if(smalltalk.assert($10)){
-$9="alternative block";
+$6=_st($7).__eq(nil);
+_st($5)._assert_($6);
+$9=self;
+$12=_st(false)._yourself();
+if(smalltalk.assert($12)){
+$11="alternative block";
+};
+$10=_st($11).__eq(nil);
+_st($9)._assert_($10);
+$13=self;
+$16=_st(false)._yourself();
+if(! smalltalk.assert($16)){
+$15="alternative block";
+};
+$14=_st($15).__eq("alternative block");
+_st($13)._assert_($14);
+$17=self;
+$20=_st(false)._yourself();
+if(smalltalk.assert($20)){
+$19="alternative block";
 } else {
-$9="alternative block2";
+$19="alternative block2";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($9,"__eq",["alternative block2"])]);
-$12=smalltalk.send(false,"_boxed",[]);
-if(smalltalk.assert($12)){
-$11="alternative block2";
+$18=_st($19).__eq("alternative block2");
+_st($17)._assert_($18);
+$21=self;
+$24=_st(false)._yourself();
+if(smalltalk.assert($24)){
+$23="alternative block2";
 } else {
-$11="alternative block";
+$23="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($11,"__eq",["alternative block"])]);
-$14=smalltalk.send(true,"_boxed",[]);
-if(smalltalk.assert($14)){
-$13="alternative block";
+$22=_st($23).__eq("alternative block");
+_st($21)._assert_($22);
+$25=self;
+$28=_st(true)._yourself();
+if(smalltalk.assert($28)){
+$27="alternative block";
 } else {
-$13="alternative block2";
+$27="alternative block2";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($13,"__eq",["alternative block"])]);
-$16=smalltalk.send(true,"_boxed",[]);
-if(smalltalk.assert($16)){
-$15="alternative block2";
+$26=_st($27).__eq("alternative block");
+_st($25)._assert_($26);
+$29=self;
+$32=_st(true)._yourself();
+if(smalltalk.assert($32)){
+$31="alternative block2";
 } else {
-$15="alternative block";
+$31="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($15,"__eq",["alternative block2"])]);
-return self}
+$30=_st($31).__eq("alternative block2");
+_st($29)._assert_($30);
+return self}, self, "testIfTrueIfFalseWithBoxing", [], smalltalk.BooleanTest)}
 }),
 smalltalk.BooleanTest);
 
@@ -404,15 +420,15 @@ smalltalk.method({
 selector: "testNonBooleanError",
 fn: function (){
 var self=this;
-var b;
-b= '' ;
-;
-smalltalk.send(self,"_should_raise_",[(function(){
-if(smalltalk.assert(self["@nonBoolean"])){
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=self;
+$2=(function(){
+return smalltalk.withContext(function($ctx2) { 
if(smalltalk.assert("")){
 } else {
 };
-}),(smalltalk.NonBooleanReceiver || NonBooleanReceiver)]);
-return self}
+})});
+_st($1)._should_raise_($2,(smalltalk.NonBooleanReceiver || NonBooleanReceiver));
+return self}, self, "testNonBooleanError", [], smalltalk.BooleanTest)}
 }),
 smalltalk.BooleanTest);
 
@@ -2786,16 +2802,3 @@ smalltalk.UndefinedTest);
 
 
 
-smalltalk.addMethod(
-"_boxed",
-smalltalk.method({
-selector: "boxed",
-fn: function (){
-var self=this;
-var $1;
-$1=self;
-return $1;
-}
-}),
-smalltalk.Boolean);
-

+ 63 - 65
js/Kernel-Tests.js

@@ -328,59 +328,75 @@ selector: "testIfTrueIfFalseWithBoxing",
 category: 'tests',
 fn: function (){
 var self=this;
-var $2,$1,$4,$3,$6,$5,$8,$7,$10,$9,$12,$11,$14,$13,$16,$15;
-$2=smalltalk.send(true,"_boxed",[]);
-if(smalltalk.assert($2)){
-$1="alternative block";
-};
-smalltalk.send(self,"_assert_",[smalltalk.send($1,"__eq",["alternative block"])]);
-$4=smalltalk.send(true,"_boxed",[]);
-if(! smalltalk.assert($4)){
+return smalltalk.withContext(function($ctx1) { 
var $1,$4,$3,$2,$5,$8,$7,$6,$9,$12,$11,$10,$13,$16,$15,$14,$17,$20,$19,$18,$21,$24,$23,$22,$25,$28,$27,$26,$29,$32,$31,$30;
+$1=self;
+$4=_st(true)._yourself();
+if(smalltalk.assert($4)){
 $3="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($3,"__eq",[nil])]);
-$6=smalltalk.send(false,"_boxed",[]);
-if(smalltalk.assert($6)){
-$5="alternative block";
-};
-smalltalk.send(self,"_assert_",[smalltalk.send($5,"__eq",[nil])]);
-$8=smalltalk.send(false,"_boxed",[]);
+$2=_st($3).__eq("alternative block");
+_st($1)._assert_($2);
+$5=self;
+$8=_st(true)._yourself();
 if(! smalltalk.assert($8)){
 $7="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($7,"__eq",["alternative block"])]);
-$10=smalltalk.send(false,"_boxed",[]);
-if(smalltalk.assert($10)){
-$9="alternative block";
+$6=_st($7).__eq(nil);
+_st($5)._assert_($6);
+$9=self;
+$12=_st(false)._yourself();
+if(smalltalk.assert($12)){
+$11="alternative block";
+};
+$10=_st($11).__eq(nil);
+_st($9)._assert_($10);
+$13=self;
+$16=_st(false)._yourself();
+if(! smalltalk.assert($16)){
+$15="alternative block";
+};
+$14=_st($15).__eq("alternative block");
+_st($13)._assert_($14);
+$17=self;
+$20=_st(false)._yourself();
+if(smalltalk.assert($20)){
+$19="alternative block";
 } else {
-$9="alternative block2";
+$19="alternative block2";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($9,"__eq",["alternative block2"])]);
-$12=smalltalk.send(false,"_boxed",[]);
-if(smalltalk.assert($12)){
-$11="alternative block2";
+$18=_st($19).__eq("alternative block2");
+_st($17)._assert_($18);
+$21=self;
+$24=_st(false)._yourself();
+if(smalltalk.assert($24)){
+$23="alternative block2";
 } else {
-$11="alternative block";
+$23="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($11,"__eq",["alternative block"])]);
-$14=smalltalk.send(true,"_boxed",[]);
-if(smalltalk.assert($14)){
-$13="alternative block";
+$22=_st($23).__eq("alternative block");
+_st($21)._assert_($22);
+$25=self;
+$28=_st(true)._yourself();
+if(smalltalk.assert($28)){
+$27="alternative block";
 } else {
-$13="alternative block2";
+$27="alternative block2";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($13,"__eq",["alternative block"])]);
-$16=smalltalk.send(true,"_boxed",[]);
-if(smalltalk.assert($16)){
-$15="alternative block2";
+$26=_st($27).__eq("alternative block");
+_st($25)._assert_($26);
+$29=self;
+$32=_st(true)._yourself();
+if(smalltalk.assert($32)){
+$31="alternative block2";
 } else {
-$15="alternative block";
+$31="alternative block";
 };
-smalltalk.send(self,"_assert_",[smalltalk.send($15,"__eq",["alternative block2"])]);
-return self},
+$30=_st($31).__eq("alternative block2");
+_st($29)._assert_($30);
+return self}, self, "testIfTrueIfFalseWithBoxing", [], smalltalk.BooleanTest)},
 args: [],
-source: "testIfTrueIfFalseWithBoxing\x0a \x0a\x09self assert: (true boxed ifTrue: ['alternative block']) = 'alternative block'.\x0a\x09self assert: (true boxed ifFalse: ['alternative block']) = nil.\x0a\x0a\x09self assert: (false boxed ifTrue: ['alternative block']) = nil.\x0a\x09self assert: (false boxed ifFalse: ['alternative block']) = 'alternative block'.\x0a\x0a\x09self assert: (false boxed ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block2'.\x0a\x09self assert: (false boxed ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block'.\x0a\x0a\x09self assert: (true boxed ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block'.\x0a\x09self assert: (true boxed ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block2'.",
-messageSends: ["assert:", "=", "ifTrue:", "boxed", "ifFalse:", "ifTrue:ifFalse:", "ifFalse:ifTrue:"],
+source: "testIfTrueIfFalseWithBoxing\x0a \x0a\x09self assert: (true yourself ifTrue: ['alternative block']) = 'alternative block'.\x0a\x09self assert: (true yourself ifFalse: ['alternative block']) = nil.\x0a\x0a\x09self assert: (false yourself ifTrue: ['alternative block']) = nil.\x0a\x09self assert: (false yourself ifFalse: ['alternative block']) = 'alternative block'.\x0a\x0a\x09self assert: (false yourself ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block2'.\x0a\x09self assert: (false yourself ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block'.\x0a\x0a\x09self assert: (true yourself ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block'.\x0a\x09self assert: (true yourself ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block2'.",
+messageSends: ["assert:", "=", "ifTrue:", "yourself", "ifFalse:", "ifTrue:ifFalse:", "ifFalse:ifTrue:"],
 referencedClasses: []
 }),
 smalltalk.BooleanTest);
@@ -480,17 +496,17 @@ selector: "testNonBooleanError",
 category: 'tests',
 fn: function (){
 var self=this;
-var b;
-b= '' ;
-;
-smalltalk.send(self,"_should_raise_",[(function(){
-if(smalltalk.assert(self["@nonBoolean"])){
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=self;
+$2=(function(){
+return smalltalk.withContext(function($ctx2) { 
if(smalltalk.assert("")){
 } else {
 };
-}),(smalltalk.NonBooleanReceiver || NonBooleanReceiver)]);
-return self},
+})});
+_st($1)._should_raise_($2,(smalltalk.NonBooleanReceiver || NonBooleanReceiver));
+return self}, self, "testNonBooleanError", [], smalltalk.BooleanTest)},
 args: [],
-source: "testNonBooleanError\x0a\x09|b|\x0a    b := < '' >.\x0a    self should: [nonBoolean ifTrue: [] ifFalse: []] raise: NonBooleanReceiver",
+source: "testNonBooleanError\x0a    self should: [ '' ifTrue: [] ifFalse: [] ] raise: NonBooleanReceiver",
 messageSends: ["should:raise:", "ifTrue:ifFalse:"],
 referencedClasses: ["NonBooleanReceiver"]
 }),
@@ -3601,21 +3617,3 @@ smalltalk.UndefinedTest);
 
 
 
-smalltalk.addMethod(
-"_boxed",
-smalltalk.method({
-selector: "boxed",
-category: '*Kernel-Tests',
-fn: function (){
-var self=this;
-var $1;
-$1=self;
-return $1;
-},
-args: [],
-source: "boxed\x0a\x09^self",
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Boolean);
-

+ 0 - 7
st/Compiler-Tests.st

@@ -359,13 +359,6 @@ testUnknownVariables
 	self should: [ analyzer visit: ast ] raise: UnknownVariableError
 !
 
-testUnknownVariablesDefinedInJS
-
-	< var someVariable = 1 >.
-
-	self shouldnt: [ smalltalk parse: 'foo someVariable' ] raise: UnknownVariableError
-!
-
 testUnknownVariablesWithScope
 	| src ast |
 

+ 0 - 1
st/IDE.st

@@ -1408,7 +1408,6 @@ renderBoxOn: html
 !
 
 renderButtonsOn: html
-	self inspect.
 	saveButton := html button
 		with: 'Save';
 		onClick: [self save].

+ 4 - 7
st/Importer-Exporter.st

@@ -345,16 +345,13 @@ Object subclass: #PackageLoader
 	instanceVariableNames: ''
 	package: 'Importer-Exporter'!
 
-!PackageLoader methodsFor: 'not yet classified'!
+!PackageLoader methodsFor: 'laoding'!
 
 initializePackageNamed: packageName prefix: aString
 
-	(Package named: packageName) classes do: [ :each |
-    	<smalltalk.init(each)>.
-        each initialize. ].
-        
-    (Package named: packageName) 
-    	commitPathJs: '/', aString, '/js';
+	(Package named: packageName) 
+    	setupClasses;
+        commitPathJs: '/', aString, '/js';
         commitPathSt: '/', aString, '/st'
 !
 

+ 37 - 19
st/Kernel-Classes.st

@@ -174,7 +174,7 @@ withAllSubclasses
 !Behavior methodsFor: 'compiling'!
 
 addCompiledMethod: aMethod
-	<smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self)>.
+	self basicAddCompiledMethod: aMethod.
     
     SystemAnnouncer current
    		announce: (MethodAdded new
@@ -195,10 +195,7 @@ compile: aString category: anotherString
 !
 
 removeCompiledMethod: aMethod
-	<
-    	smalltalk.removeMethod(aMethod)
-		smalltalk.init(self);
-    >.
+	self basicRemoveCompiledMethod: aMethod.
     
     SystemAnnouncer current
    		announce: (MethodRemoved new
@@ -217,6 +214,19 @@ new
 	^self basicNew initialize
 ! !
 
+!Behavior methodsFor: 'private'!
+
+basicAddCompiledMethod: aMethod
+	<smalltalk.addMethod(aMethod.selector._asSelector(), aMethod, self)>
+!
+
+basicRemoveCompiledMethod: aMethod
+	<
+    	smalltalk.removeMethod(aMethod)
+		smalltalk.init(self);
+    >
+! !
+
 !Behavior methodsFor: 'testing'!
 
 canUnderstand: aSelector
@@ -387,23 +397,16 @@ Rather than using ClassBuilder directly to compile a class, use `Class >> subcla
 !ClassBuilder methodsFor: 'class creation'!
 
 class: aClass instanceVariableNames: aString
-	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
-	aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).
+	self basicClass: aClass instanceVariableNames: aString.
     
     SystemAnnouncer current
     	announce: (ClassDefinitionChanged new
         	theClass: aClass;
-            yourself).
-    
-	self setupClass: aClass
+            yourself)
 !
 
 renameClass: aClass to: aString
-	<
-		smalltalk[aString] = aClass;
-		delete smalltalk[aClass.className];
-		aClass.className = aString;
-	>.
+	self basicRenameClass: aClass to: aString.
     
     SystemAnnouncer current
     	announce: (ClassRenamed new
@@ -411,6 +414,10 @@ renameClass: aClass to: aString
             yourself)
 !
 
+setupClass: aClass
+	<smalltalk.init(aClass);>
+!
+
 superclass: aClass subclass: aString
 	^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
 !
@@ -443,6 +450,21 @@ addSubclassOf: aClass named: aString instanceVariableNames: aCollection package:
 	    return smalltalk[aString]>
 !
 
+basicClass: aClass instanceVariableNames: aString
+	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
+	aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).
+    
+	self setupClass: aClass
+!
+
+basicRenameClass: aClass to: aString
+	<
+		smalltalk[aString] = aClass;
+		delete smalltalk[aClass.className];
+		aClass.className = aString;
+	>
+!
+
 copyClass: aClass named: aString
 	| newClass |
 
@@ -466,10 +488,6 @@ copyClass: aClass named: aString
 
 instanceVariableNamesFor: aString
 	^(aString tokenize: ' ') reject: [:each | each isEmpty]
-!
-
-setupClass: aClass
-	<smalltalk.init(aClass);>
 ! !
 
 Object subclass: #ClassCategoryReader

+ 9 - 5
st/Kernel-Collections.st

@@ -810,9 +810,9 @@ remove: anObject ifAbsent: aBlock
 				self.splice(i,1);
 				return self;
 			}
-		}
-	>.
-	aBlock value
+		};
+        aBlock._value();
+	>
 !
 
 removeFrom: aNumber to: anotherNumber
@@ -995,8 +995,12 @@ unescaped
 !
 
 = aString
-	aString class = self class ifFalse: [^false].
-	<return String(self) === String(aString)>
+	<
+    	if(!! aString._isString || !! aString._isString()) {
+        	return false;
+        }
+    	return String(self) === String(aString)
+    >
 !
 
 == aString

+ 79 - 47
st/Kernel-Objects.st

@@ -277,6 +277,10 @@ ifNotNil: aBlock ifNil: anotherBlock
 	^aBlock value
 !
 
+isBoolean
+	^ false
+!
+
 isClass
 	^false
 !
@@ -341,8 +345,12 @@ Boolean instances are weither `true` or `false`.!
 !Boolean methodsFor: 'comparing'!
 
 = aBoolean
-	aBoolean class = self class ifFalse: [^false].
-	<return Boolean(self == true) == aBoolean>
+	<
+    	if(!! aBoolean._isBoolean || !! aBoolean._isBoolean()) {
+        	return false;
+        }
+    	return Boolean(self == true) == aBoolean
+    >
 !
 
 == aBoolean
@@ -435,6 +443,12 @@ printString
 	<return self.toString()>
 ! !
 
+!Boolean methodsFor: 'testing'!
+
+isBoolean
+	^ true
+! !
+
 Object subclass: #CompiledMethod
 	instanceVariableNames: ''
 	package: 'Kernel-Methods'!
@@ -762,21 +776,24 @@ keysAndValuesDo: aBlock
 !JSObjectProxy methodsFor: 'proxy'!
 
 addObjectVariablesTo: aDictionary
-	<for(var i in self['@jsObject']) {
-		aDictionary._at_put_(i, self['@jsObject'][i]);
-	}>.
+	<
+    	for(var i in self['@jsObject']) {
+			aDictionary._at_put_(i, self['@jsObject'][i]);
+		}
+    >
 !
 
 doesNotUnderstand: aMessage
-	<
-    	var jsSelector = aMessage._selector()._asJavaScriptSelector();
-        var object = self._jsObject();
-    	if(jsSelector in object) {
-        	return smalltalk.send(object, jsSelector, aMessage._arguments());
-        }
-    >.
     
-	super doesNotUnderstand: aMessage
+   ^ (self canForwardMessage: aMessage) 
+    	ifTrue: [ self forwardMessage: aMessage ]
+        ifFalse: [ ^ super doesNotUnderstand: aMessage ]
+!
+
+forwardMessage: aMessage
+	<
+    	return smalltalk.send(self._jsObject(), aMessage._selector()._asJavaScriptSelector(), aMessage._arguments());
+    >
 !
 
 inspectOn: anInspector
@@ -792,6 +809,19 @@ printString
 	^self jsObject toString
 ! !
 
+!JSObjectProxy methodsFor: 'testing'!
+
+canForwardMessage: aMessage
+	<
+    	var jsSelector = aMessage._selector()._asJavaScriptSelector();
+    	if(jsSelector in self._jsObject()) {
+        	return true
+        } else {
+        	return false;
+        }
+    >
+! !
+
 !JSObjectProxy class methodsFor: 'instance creation'!
 
 on: aJSObject
@@ -855,7 +885,7 @@ identityHash
 !
 
 abs
-	^ <Math.abs(self);>
+	<return Math.abs(self);>
 !
 
 max: aNumber
@@ -891,8 +921,12 @@ squared
 !
 
 = aNumber
-	aNumber isNumber ifFalse: [^false]. 
-	<return Number(self) == aNumber>
+	<
+    	if(!! aNumber._isNumber || !! aNumber._isNumber()) {
+        	return false;
+        }
+    	return Number(self) == aNumber
+    >
 !
 
 > aNumber
@@ -1173,6 +1207,12 @@ classes
 	^ self organization elements
 !
 
+setupClasses
+	self classes
+		do: [ :each | ClassBuilder new setupClass: each ];
+		do: [ :each | each initialize ]
+!
+
 sortedClasses
 	"Answer all classes in the receiver, sorted by superclass/subclasses and by class name for common subclasses (Issue #143)."
 
@@ -1218,6 +1258,18 @@ propertyAt: key put: value
 
 Package class instanceVariableNames: 'defaultCommitPathJs defaultCommitPathSt'!
 
+!Package class methodsFor: 'accessing'!
+
+named: aPackageName
+
+	^Smalltalk current packageAt: aPackageName
+!
+
+named: aPackageName ifAbsent: aBlock
+
+	^Smalltalk current packageAt: aPackageName ifAbsent: aBlock
+! !
+
 !Package class methodsFor: 'commit paths'!
 
 defaultCommitPathJs
@@ -1243,37 +1295,15 @@ resetCommitPaths
 
 !Package class methodsFor: 'loading-storing'!
 
-commitToLocalStorage: aPackageName
-	| key sourceCode |
-	key := 'smalltalk.packages.' , aPackageName.
-	sourceCode := Exporter new exportPackage: aPackageName.
-	<localStorage[key] = escape(sourceCode)>
-!
-
 fetch: aPackageName
 	self fetch: aPackageName prefix: self defaultCommitPathJs, '/'
 !
 
 fetch: aPackageName prefix: aPrefix
-	jQuery getScript: (aPrefix , aPackageName , '.js') onSuccess: [ Package init: aPackageName ]
-!
-
-init: aPackageName
-	(smalltalk classes select: [ :each | <each.pkg.pkgName == aPackageName> ])
-		do: [ :each | <smalltalk.init(each)> ];
-		do: [ :each | each initialize ]
-! !
-
-!Package class methodsFor: 'not yet classified'!
-
-named: aPackageName
-
-	^Smalltalk current packageAt: aPackageName
-!
-
-named: aPackageName ifAbsent: aBlock
-
-	^Smalltalk current packageAt: aPackageName ifAbsent: aBlock
+	jQuery 
+    	getScript: (aPrefix , aPackageName , '.js') 
+        onSuccess: [ 
+        	(Package named: aPackageName) setupClasses ]
 ! !
 
 !Package class methodsFor: 'sorting'!
@@ -1473,10 +1503,6 @@ at: aSymbol
 	<return self[aSymbol._asString()]>
 !
 
-basicParse: aString
-	<return smalltalk.parser.parse(aString)>
-!
-
 parse: aString
 	| result | 
 	self try: [result := self basicParse: aString] catch: [:ex | (self parseError: ex parsing: aString) signal].
@@ -1575,11 +1601,17 @@ renamePackage: packageName to: newName
 	| pkg |
 	pkg := self packageAt: packageName ifAbsent: [self error: 'Missing package: ', packageName].
 	(self packageAt: newName) ifNotNil: [self error: 'Already exists a package called: ', newName].
-	<smalltalk.packages[newName] = smalltalk.packages[packageName]>.
+    (self basicAt: 'packages') at: newName put: pkg.
 	pkg name: newName.
 	self deletePackage: packageName.
 ! !
 
+!Smalltalk methodsFor: 'private'!
+
+basicParse: aString
+	<return smalltalk.parser.parse(aString)>
+! !
+
 Smalltalk class instanceVariableNames: 'current'!
 
 !Smalltalk class methodsFor: 'accessing'!

+ 9 - 17
st/Kernel-Tests.st

@@ -123,17 +123,17 @@ testIfTrueIfFalse
 
 testIfTrueIfFalseWithBoxing
  
-	self assert: (true boxed ifTrue: ['alternative block']) = 'alternative block'.
-	self assert: (true boxed ifFalse: ['alternative block']) = nil.
+	self assert: (true yourself ifTrue: ['alternative block']) = 'alternative block'.
+	self assert: (true yourself ifFalse: ['alternative block']) = nil.
 
-	self assert: (false boxed ifTrue: ['alternative block']) = nil.
-	self assert: (false boxed ifFalse: ['alternative block']) = 'alternative block'.
+	self assert: (false yourself ifTrue: ['alternative block']) = nil.
+	self assert: (false yourself ifFalse: ['alternative block']) = 'alternative block'.
 
-	self assert: (false boxed ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block2'.
-	self assert: (false boxed ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block'.
+	self assert: (false yourself ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block2'.
+	self assert: (false yourself ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block'.
 
-	self assert: (true boxed ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block'.
-	self assert: (true boxed ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block2'.
+	self assert: (true yourself ifTrue: ['alternative block'] ifFalse: ['alternative block2']) = 'alternative block'.
+	self assert: (true yourself ifFalse: ['alternative block'] ifTrue: ['alternative block2']) = 'alternative block2'.
 !
 
 testLogic
@@ -172,9 +172,7 @@ testLogicKeywords
 !
 
 testNonBooleanError
-	|b|
-    b := < '' >.
-    self should: [nonBoolean ifTrue: [] ifFalse: []] raise: NonBooleanReceiver
+    self should: [ '' ifTrue: [] ifFalse: [] ] raise: NonBooleanReceiver
 ! !
 
 TestCase subclass: #ClassBuilderTest
@@ -1428,9 +1426,3 @@ testIsNil
 	self deny: nil notNil.
 ! !
 
-!Boolean methodsFor: '*Kernel-Tests'!
-
-boxed
-	^self
-! !
-