Browse Source

Merge pull request #802 from herby/smalltalk-class-delegates-not-wraps

Smalltalk class delegates not wraps
Nicolas Petton 10 years ago
parent
commit
0a993c3837
3 changed files with 73 additions and 66 deletions
  1. 40 35
      js/Kernel-Infrastructure.js
  2. 15 13
      st/Kernel-Infrastructure.st
  3. 18 18
      support/boot.js

+ 40 - 35
js/Kernel-Infrastructure.js

@@ -2055,13 +2055,11 @@ protocol: 'accessing',
 fn: function (aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=self._basicAt_(aString);
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"at:",{aString:aString},smalltalk.Smalltalk)})},
+return smalltalk[aString];
+return self}, function($ctx1) {$ctx1.fill(self,"at:",{aString:aString},smalltalk.Smalltalk)})},
 args: ["aString"],
-source: "at: aString\x0a\x09^ self basicAt: aString",
-messageSends: ["basicAt:"],
+source: "at: aString\x0a\x09<return smalltalk[aString]>",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Smalltalk);
@@ -2096,13 +2094,11 @@ protocol: 'accessing',
 fn: function (aString,anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=self._basicAt_put_(aString,anObject);
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"at:put:",{aString:aString,anObject:anObject},smalltalk.Smalltalk)})},
+return smalltalk[aString]=anObject;
+return self}, function($ctx1) {$ctx1.fill(self,"at:put:",{aString:aString,anObject:anObject},smalltalk.Smalltalk)})},
 args: ["aString", "anObject"],
-source: "at: aString put: anObject\x0a\x09^ self basicAt: aString put: anObject",
-messageSends: ["basicAt:put:"],
+source: "at: aString put: anObject\x0a\x09<return smalltalk[aString]=anObject>",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Smalltalk);
@@ -2146,10 +2142,10 @@ protocol: 'classes',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self.classes();
+return smalltalk.classes();
 return self}, function($ctx1) {$ctx1.fill(self,"classes",{},smalltalk.Smalltalk)})},
 args: [],
-source: "classes\x0a\x09<return self.classes()>",
+source: "classes\x0a\x09<return smalltalk.classes()>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2246,10 +2242,10 @@ protocol: 'private',
 fn: function (aClass){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self.removeClass(aClass);
+smalltalk.removeClass(aClass);
 return self}, function($ctx1) {$ctx1.fill(self,"deleteClass:",{aClass:aClass},smalltalk.Smalltalk)})},
 args: ["aClass"],
-source: "deleteClass: aClass\x0a\x09\x22Deletes a class by deleting its binding only. Use #removeClass instead\x22\x0a\x09\x0a\x09<self.removeClass(aClass)>",
+source: "deleteClass: aClass\x0a\x09\x22Deletes a class by deleting its binding only. Use #removeClass instead\x22\x0a\x09\x0a\x09<smalltalk.removeClass(aClass)>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2280,10 +2276,10 @@ protocol: 'private',
 fn: function (packageName){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-delete self.packages[ packageName];
+delete smalltalk.packages[packageName];
 return self}, function($ctx1) {$ctx1.fill(self,"deletePackage:",{packageName:packageName},smalltalk.Smalltalk)})},
 args: ["packageName"],
-source: "deletePackage: packageName\x0a\x09\x22Deletes a package by deleting its binding, but does not check if it contains classes etc.\x0a\x09To remove a package, use #removePackage instead.\x22\x0a\x0a\x09<delete self.packages[ packageName]>",
+source: "deletePackage: packageName\x0a\x09\x22Deletes a package by deleting its binding, but does not check if it contains classes etc.\x0a\x09To remove a package, use #removePackage instead.\x22\x0a\x0a\x09<delete smalltalk.packages[packageName]>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2296,10 +2292,10 @@ protocol: 'globals',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self.globalJsVariables;
+return smalltalk.globalJsVariables;
 return self}, function($ctx1) {$ctx1.fill(self,"globalJsVariables",{},smalltalk.Smalltalk)})},
 args: [],
-source: "globalJsVariables\x0a\x09\x22Array of global JavaScript variables\x22\x0a\x09<return self.globalJsVariables>",
+source: "globalJsVariables\x0a\x09\x22Array of global JavaScript variables\x22\x0a\x09<return smalltalk.globalJsVariables>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2312,10 +2308,10 @@ protocol: 'accessing',
 fn: function (aKey){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self.hasOwnProperty(aKey);
+return smalltalk.hasOwnProperty(aKey);
 return self}, function($ctx1) {$ctx1.fill(self,"includesKey:",{aKey:aKey},smalltalk.Smalltalk)})},
 args: ["aKey"],
-source: "includesKey: aKey\x0a\x09<return self.hasOwnProperty(aKey)>",
+source: "includesKey: aKey\x0a\x09<return smalltalk.hasOwnProperty(aKey)>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2344,10 +2340,10 @@ protocol: 'packages',
 fn: function (packageName){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self.packages[ packageName];
+return smalltalk.packages[packageName];
 return self}, function($ctx1) {$ctx1.fill(self,"packageAt:",{packageName:packageName},smalltalk.Smalltalk)})},
 args: ["packageName"],
-source: "packageAt: packageName\x0a\x09<return self.packages[ packageName]>",
+source: "packageAt: packageName\x0a\x09<return smalltalk.packages[packageName]>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2380,13 +2376,13 @@ fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 
-		return Object.keys(self.packages).map(function(k) {
-			return self.packages[k];
+		return Object.keys(smalltalk.packages).map(function(k) {
+			return smalltalk.packages[k];
 		})
 	;
 return self}, function($ctx1) {$ctx1.fill(self,"packages",{},smalltalk.Smalltalk)})},
 args: [],
-source: "packages\x0a\x09\x22Return all Package instances in the system.\x22\x0a\x0a\x09<\x0a\x09\x09return Object.keys(self.packages).map(function(k) {\x0a\x09\x09\x09return self.packages[k];\x0a\x09\x09})\x0a\x09>",
+source: "packages\x0a\x09\x22Return all Package instances in the system.\x22\x0a\x0a\x09<\x0a\x09\x09return Object.keys(smalltalk.packages).map(function(k) {\x0a\x09\x09\x09return smalltalk.packages[k];\x0a\x09\x09})\x0a\x09>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2480,10 +2476,10 @@ protocol: 'accessing',
 fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self.readJSObject(anObject);
+return smalltalk.readJSObject(anObject);
 return self}, function($ctx1) {$ctx1.fill(self,"readJSObject:",{anObject:anObject},smalltalk.Smalltalk)})},
 args: ["anObject"],
-source: "readJSObject: anObject\x0a\x09<return self.readJSObject(anObject)>",
+source: "readJSObject: anObject\x0a\x09<return smalltalk.readJSObject(anObject)>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2581,10 +2577,10 @@ protocol: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self.reservedWords;
+return smalltalk.reservedWords;
 return self}, function($ctx1) {$ctx1.fill(self,"reservedWords",{},smalltalk.Smalltalk)})},
 args: [],
-source: "reservedWords\x0a\x09\x22JavaScript reserved words\x22\x0a\x09<return self.reservedWords>",
+source: "reservedWords\x0a\x09\x22JavaScript reserved words\x22\x0a\x09<return smalltalk.reservedWords>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2607,6 +2603,7 @@ referencedClasses: []
 smalltalk.Smalltalk);
 
 
+smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
 smalltalk.method({
 selector: "current",
@@ -2614,11 +2611,19 @@ protocol: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return smalltalk;
-return self}, function($ctx1) {$ctx1.fill(self,"current",{},smalltalk.Smalltalk.klass)})},
+var $2,$1;
+$2=self["@current"];
+if(($receiver = $2) == nil || $receiver == null){
+self["@current"]=self._new();
+$1=self["@current"];
+} else {
+$1=$2;
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"current",{},smalltalk.Smalltalk.klass)})},
 args: [],
-source: "current\x0a\x09<return smalltalk>",
-messageSends: [],
+source: "current\x0a\x09^ current ifNil: [ current := self new ]",
+messageSends: ["ifNil:", "new"],
 referencedClasses: []
 }),
 smalltalk.Smalltalk.klass);

+ 15 - 13
st/Kernel-Infrastructure.st

@@ -779,7 +779,7 @@ It requires the `Compiler` package and the `js/parser.js` parser file in order t
 !Smalltalk methodsFor: 'accessing'!
 
 at: aString
-	^ self basicAt: aString
+	<return smalltalk[aString]>
 !
 
 at: aKey ifAbsent: aBlock
@@ -789,11 +789,11 @@ at: aKey ifAbsent: aBlock
 !
 
 at: aString put: anObject
-	^ self basicAt: aString put: anObject
+	<return smalltalk[aString]=anObject>
 !
 
 includesKey: aKey
-	<return self.hasOwnProperty(aKey)>
+	<return smalltalk.hasOwnProperty(aKey)>
 !
 
 parse: aString
@@ -813,12 +813,12 @@ pseudoVariableNames
 !
 
 readJSObject: anObject
-	<return self.readJSObject(anObject)>
+	<return smalltalk.readJSObject(anObject)>
 !
 
 reservedWords
 	"JavaScript reserved words"
-	<return self.reservedWords>
+	<return smalltalk.reservedWords>
 !
 
 version
@@ -844,7 +844,7 @@ defaultAmdNamespace: aString
 !Smalltalk methodsFor: 'classes'!
 
 classes
-	<return self.classes()>
+	<return smalltalk.classes()>
 !
 
 removeClass: aClass
@@ -885,7 +885,7 @@ deleteGlobalJsVariable: aString
 
 globalJsVariables
 	"Array of global JavaScript variables"
-	<return self.globalJsVariables>
+	<return smalltalk.globalJsVariables>
 ! !
 
 !Smalltalk methodsFor: 'packages'!
@@ -904,7 +904,7 @@ createPackage: packageName
 !
 
 packageAt: packageName
-	<return self.packages[ packageName]>
+	<return smalltalk.packages[packageName]>
 !
 
 packageAt: packageName ifAbsent: aBlock
@@ -915,8 +915,8 @@ packages
 	"Return all Package instances in the system."
 
 	<
-		return Object.keys(self.packages).map(function(k) {
-			return self.packages[k];
+		return Object.keys(smalltalk.packages).map(function(k) {
+			return smalltalk.packages[k];
 		})
 	>
 !
@@ -964,14 +964,14 @@ createPackage: packageName properties: aDict
 deleteClass: aClass
 	"Deletes a class by deleting its binding only. Use #removeClass instead"
 	
-	<self.removeClass(aClass)>
+	<smalltalk.removeClass(aClass)>
 !
 
 deletePackage: packageName
 	"Deletes a package by deleting its binding, but does not check if it contains classes etc.
 	To remove a package, use #removePackage instead."
 
-	<delete self.packages[ packageName]>
+	<delete smalltalk.packages[packageName]>
 ! !
 
 !Smalltalk methodsFor: 'testing'!
@@ -983,10 +983,12 @@ isSmalltalkObject: anObject
 	<return typeof anObject.klass !!== 'undefined'>
 ! !
 
+Smalltalk class instanceVariableNames: 'current'!
+
 !Smalltalk class methodsFor: 'accessing'!
 
 current
-	<return smalltalk>
+	^ current ifNil: [ current := self new ]
 ! !
 
 !SequenceableCollection methodsFor: '*Kernel-Infrastructure'!

+ 18 - 18
support/boot.js

@@ -92,27 +92,24 @@ function inherits(child, parent) {
 	return child;
 }
 
-/* Smalltalk foundational objects */
-
-/* SmalltalkRoot is the hidden root of the Amber hierarchy.
- All objects including `Object` inherit from SmalltalkRoot */
-function SmalltalkRoot() {}
-function SmalltalkProtoObject() {}
-inherits(SmalltalkProtoObject, SmalltalkRoot);
-function SmalltalkObject() {}
-inherits(SmalltalkObject, SmalltalkProtoObject);
-
-function Smalltalk() {}
-inherits(Smalltalk, SmalltalkObject);
-
-var api = new Smalltalk();
+var api = {};
 var brikz = new Brikz(api);
 
 function RootBrik(brikz, st) {
 
+	/* Smalltalk foundational objects */
+
+	/* SmalltalkRoot is the hidden root of the Amber hierarchy.
+	 All objects including `Object` inherit from SmalltalkRoot */
+	function SmalltalkRoot() {}
+	function SmalltalkProtoObject() {}
+	inherits(SmalltalkProtoObject, SmalltalkRoot);
+	function SmalltalkObject() {}
+	inherits(SmalltalkObject, SmalltalkProtoObject);
 	function SmalltalkNil() {}
 	inherits(SmalltalkNil, SmalltalkObject);
 
+	this.Object = SmalltalkObject;
 	this.nil = new SmalltalkNil();
 
 	// Hidden root class of the system.
@@ -123,7 +120,6 @@ function RootBrik(brikz, st) {
 		st.addPackage("Kernel-Infrastructure");
 		st.wrapClassName("ProtoObject", "Kernel-Objects", SmalltalkProtoObject, undefined, false);
 		st.wrapClassName("Object", "Kernel-Objects", SmalltalkObject, st.ProtoObject, false);
-		st.wrapClassName("Smalltalk", "Kernel-Infrastructure", Smalltalk, st.Object, false);
 		st.wrapClassName("UndefinedObject", "Kernel-Objects", SmalltalkNil, st.Object, false);
 	};
 }
@@ -131,7 +127,7 @@ function RootBrik(brikz, st) {
 function OrganizeBrik(brikz, st) {
 
 	brikz.ensure("augments");
-	brikz.ensure("root");
+	var SmalltalkObject = brikz.ensure("root").Object;
 
 	function SmalltalkOrganizer () {}
 	function SmalltalkPackageOrganizer () {
@@ -308,6 +304,7 @@ function ClassesBrik(brikz, st) {
 	var root = brikz.ensure("root");
 	var nil = root.nil;
 	var rootAsClass = root.rootAsClass;
+	var SmalltalkObject = root.Object;
 	rootAsClass.klass = {fn: SmalltalkClass};
 
 	function SmalltalkPackage() {}
@@ -569,6 +566,7 @@ function MethodsBrik(brikz, st) {
 	var org = brikz.ensure("organize");
 	var stInit = brikz.ensure("stInit");
 	var dnu = brikz.ensure("dnu");
+	var SmalltalkObject = brikz.ensure("root").Object;
 	brikz.ensure("selectorConversion");
 	brikz.ensure("classes");
 	brikz.ensure("classInit");
@@ -819,7 +817,9 @@ function PrimitivesBrik(brikz, st) {
 function RuntimeBrik(brikz, st) {
 
 	brikz.ensure("selectorConversion");
-	var nil = brikz.ensure("root").nil;
+	var root = brikz.ensure("root");
+	var nil = root.nil;
+	var SmalltalkObject = root.Object;
 
 	function SmalltalkMethodContext(home, setup) {
 		this.sendIdx     = {};
@@ -902,7 +902,7 @@ function RuntimeBrik(brikz, st) {
 	}
 
 	/* Wrap a JavaScript exception in a Smalltalk Exception. 
-	 
+
 	 In case of a RangeError, stub the stack after 100 contexts to
 	 avoid another RangeError later when the stack is manipulated. */
 	function wrappedError(error) {