Parcourir la source

boot.js: updated Brikz, moved bootstrapping to __init__s

Herbert Vojčík il y a 11 ans
Parent
commit
2bc740c781
1 fichiers modifiés avec 63 ajouts et 67 suppressions
  1. 63 67
      js/boot.js

+ 63 - 67
js/boot.js

@@ -68,7 +68,7 @@ function Brikz(api, apiKey, initKey) {
 		ensure: { value: null,
 			enumerable: false, configurable: true, writable: true},
 		rebuild: { value: function() {
-			var obrikz = mixin(backup, {});
+			var obrikz = mixin(backup, {}), inits = [], chk = {};
 			forEach(obrikz, function(brik) {
 				mixin({}, api, brik[apiKey] || Object.keys(brik));
 			});
@@ -79,6 +79,7 @@ function Brikz(api, apiKey, initKey) {
 				mixin({}, api, Object.keys(api));
 				while (typeof b === "function") b = new b(brikz, api, bak);
 				if (b && !b[apiKey]) b[apiKey] = mixin(api, {});
+				if (b && b[initKey] && !chk[key]) { chk[key]=1;inits.push(b); }
 				return brikz[key] = backup[key] = b;
 			}
 			forEach(brikz, function(brik, key) { brikz.ensure(key); });
@@ -86,7 +87,7 @@ function Brikz(api, apiKey, initKey) {
 			mixin({}, api, Object.keys(api));
 			mixin(oapi, api);
 			forEach(brikz, function(brik) { mixin(brik[apiKey] || {}, api); });
-			forEach(brikz, function(brik) {brik[initKey] && brik[initKey]();});
+			inits.forEach(function(brik) { brik[initKey](); });
 		}, enumerable: false, configurable: true, writable: false }});
 }
 
@@ -112,11 +113,18 @@ var nil = new SmalltalkNil();
 var api = new Smalltalk;
 var brikz = new Brikz(api);
 
+function RootBrik(brikz, st) {
+	this.__init__ = function () {
+		st.wrapClassName("Object", "Kernel-Objects", SmalltalkObject, undefined, false);
+		st.wrapClassName("Smalltalk", "Kernel-Objects", Smalltalk, st.Object, false);
+		st.wrapClassName("UndefinedObject", "Kernel-Objects", SmalltalkNil, st.Object, false);
+	};
+}
+
 function OrganizeBrik(brikz, st) {
 
 	brikz.ensure("augments");
-
-	var org = this;
+	brikz.ensure("root");
 
 	function SmalltalkOrganizer () {}
 	function SmalltalkPackageOrganizer () {
@@ -130,24 +138,26 @@ function OrganizeBrik(brikz, st) {
 	inherits(SmalltalkPackageOrganizer, SmalltalkOrganizer);
 	inherits(SmalltalkClassOrganizer, SmalltalkOrganizer);
 
-	org.Organizer = SmalltalkOrganizer;
-	org.PackageOrganizer = SmalltalkPackageOrganizer;
-	org.ClassOrganizer = SmalltalkClassOrganizer;
+	this.__init__ = function () {
+		st.wrapClassName("Organizer", "Kernel-Objects", SmalltalkOrganizer, st.Object, false);
+		st.wrapClassName("PackageOrganizer", "Kernel-Objects", SmalltalkPackageOrganizer, st.Organizer, false);
+		st.wrapClassName("ClassOrganizer", "Kernel-Objects", SmalltalkClassOrganizer, st.Organizer, false);
+	};
 
-	org.setupClassOrganization = function (klass) {
-		klass.organization = new org.ClassOrganizer;
+	this.setupClassOrganization = function (klass) {
+		klass.organization = new SmalltalkClassOrganizer;
 		klass.organization.theClass = klass;
 	};
 
-	org.setupPackageOrganization = function (pkg) {
-		pkg.organization = new org.PackageOrganizer;
+	this.setupPackageOrganization = function (pkg) {
+		pkg.organization = new SmalltalkPackageOrganizer;
 	};
 
-	org.addOrganizationElement = function (owner, element) {
+	this.addOrganizationElement = function (owner, element) {
 		owner.organization.elements.addElement(element);
 	};
 
-	org.removeOrganizationElement = function (owner, element) {
+	this.removeOrganizationElement = function (owner, element) {
 		owner.organization.elements.removeElement(element);
 	};
 }
@@ -304,10 +314,15 @@ function ClassesBrik(brikz, st) {
 	inherits(SmalltalkClass, SmalltalkBehavior);
 	inherits(SmalltalkMetaclass, SmalltalkBehavior);
 
-	this.Package = SmalltalkPackage;
-	this.Behavior = SmalltalkBehavior;
-	this.Class = SmalltalkClass;
-	this.Metaclass = SmalltalkMetaclass;
+	this.__init__ = function () {
+		st.wrapClassName("Behavior", "Kernel-Classes", SmalltalkBehavior, st.Object, false);
+		st.wrapClassName("Metaclass", "Kernel-Classes", SmalltalkMetaclass, st.Behavior, false);
+		st.wrapClassName("Class", "Kernel-Classes", SmalltalkClass, st.Behavior, false);
+
+		st.Object.klass.superclass = st.Class;
+
+		st.wrapClassName("Package", "Kernel-Objects", SmalltalkPackage, st.Object, false);
+	};
 
 	/* Smalltalk classes */
 
@@ -529,7 +544,9 @@ function MethodsBrik(brikz, st) {
 	function SmalltalkMethod() {}
 	inherits(SmalltalkMethod, SmalltalkObject);
 
-	this.Method = SmalltalkMethod;
+	this.__init__ = function () {
+		st.wrapClassName("CompiledMethod", "Kernel-Methods", SmalltalkMethod, st.Object, false);
+	};
 
 	/* Smalltalk method object. To add a method to a class,
 	 use smalltalk.addMethod() */
@@ -676,6 +693,27 @@ function SmalltalkInitBrik(brikz, st) {
 		return initialized;
 	};
 
+	this.__init__ = function () {
+		st.wrapClassName("Number", "Kernel-Objects", Number, st.Object);
+		st.wrapClassName("BlockClosure", "Kernel-Methods", Function, st.Object);
+		st.wrapClassName("Boolean", "Kernel-Objects", Boolean, st.Object);
+		st.wrapClassName("Date", "Kernel-Objects", Date, st.Object);
+
+		st.addClass("Collection", st.Object, null, "Kernel-Collections");
+		st.addClass("IndexableCollection", st.Collection, null, "Kernel-Collections");
+		st.addClass("SequenceableCollection", st.IndexableCollection, null, "Kernel-Collections");
+		st.addClass("CharacterArray", st.SequenceableCollection, null, "Kernel-Collections");
+		st.wrapClassName("String", "Kernel-Collections", String, st.CharacterArray);
+		st.wrapClassName("Array", "Kernel-Collections", Array, st.SequenceableCollection);
+		st.wrapClassName("RegularExpression", "Kernel-Collections", RegExp, st.Object);
+
+		st.wrapClassName("Error", "Kernel-Exceptions", Error, st.Object);
+
+		/* Alias definitions */
+
+		st.alias(st.Array, "OrderedCollection");
+		st.alias(st.Date, "Time");
+	};
 }
 
 function PrimitivesBrik(brikz, st) {
@@ -743,6 +781,8 @@ function PrimitivesBrik(brikz, st) {
 
 function RuntimeBrik(brikz, st) {
 
+	brikz.ensure("root");
+
 	function SmalltalkMethodContext(home, setup) {
 		this.homeContext = home;
 		this.setup       = setup || function() {};
@@ -756,7 +796,10 @@ function RuntimeBrik(brikz, st) {
 	SmalltalkMethodContext.prototype.lookupClass = null;
 
 	inherits(SmalltalkMethodContext, SmalltalkObject);
-	this.MethodContext = SmalltalkMethodContext;
+
+	this.__init__ = function () {
+		st.wrapClassName("MethodContext", "Kernel-Methods", SmalltalkMethodContext, st.Object, false);
+	};
 
 	SmalltalkMethodContext.prototype.fill = function(receiver, selector, locals, lookupClass) {
 		this.receiver    = receiver;
@@ -1001,52 +1044,7 @@ function SelectorConversionBrik(brikz, st) {
 	}
 }
 
-function BootstrapBrik(brikz, st) {
-
-	brikz.ensure("classes");
-	brikz.ensure("methods");
-	brikz.ensure("organize");
-	brikz.ensure("runtime");
-
-	this.bootstrap = function () {
-		st.wrapClassName("Object", "Kernel-Objects", SmalltalkObject, undefined, false);
-		st.wrapClassName("Behavior", "Kernel-Classes", brikz.classes.Behavior, st.Object, false);
-		st.wrapClassName("Metaclass", "Kernel-Classes", brikz.classes.Metaclass, st.Behavior, false);
-		st.wrapClassName("Class", "Kernel-Classes", brikz.classes.Class, st.Behavior, false);
-
-		st.Object.klass.superclass = st.Class;
-
-		st.wrapClassName("Smalltalk", "Kernel-Objects", Smalltalk, st.Object, false);
-		st.wrapClassName("Package", "Kernel-Objects", brikz.classes.Package, st.Object, false);
-		st.wrapClassName("CompiledMethod", "Kernel-Methods", brikz.methods.Method, st.Object, false);
-		st.wrapClassName("Organizer", "Kernel-Objects", brikz.organize.Organizer, st.Object, false);
-		st.wrapClassName("PackageOrganizer", "Kernel-Objects", brikz.organize.PackageOrganizer, st.Organizer, false);
-		st.wrapClassName("ClassOrganizer", "Kernel-Objects", brikz.organize.ClassOrganizer, st.Organizer, false);
-
-		st.wrapClassName("Number", "Kernel-Objects", Number, st.Object);
-		st.wrapClassName("BlockClosure", "Kernel-Methods", Function, st.Object);
-		st.wrapClassName("Boolean", "Kernel-Objects", Boolean, st.Object);
-		st.wrapClassName("Date", "Kernel-Objects", Date, st.Object);
-		st.wrapClassName("UndefinedObject", "Kernel-Objects", SmalltalkNil, st.Object, false);
-
-		st.addClass("Collection", st.Object, null, "Kernel-Collections");
-		st.addClass("IndexableCollection", st.Collection, null, "Kernel-Collections");
-		st.addClass("SequenceableCollection", st.IndexableCollection, null, "Kernel-Collections");
-		st.addClass("CharacterArray", st.SequenceableCollection, null, "Kernel-Collections");
-		st.wrapClassName("String", "Kernel-Collections", String, st.CharacterArray);
-		st.wrapClassName("Array", "Kernel-Collections", Array, st.SequenceableCollection);
-		st.wrapClassName("RegularExpression", "Kernel-Collections", RegExp, st.Object);
-
-		st.wrapClassName("Error", "Kernel-Exceptions", Error, st.Object);
-		st.wrapClassName("MethodContext", "Kernel-Methods", brikz.runtime.MethodContext, st.Object, false);
-
-		/* Alias definitions */
-
-		st.alias(st.Array, "OrderedCollection");
-		st.alias(st.Date, "Time");
-	};
-}
-
+brikz.root = RootBrik;
 brikz.dnu = DNUBrik;
 brikz.messageSend = MessageSendBrik;
 brikz.organize = OrganizeBrik;
@@ -1059,10 +1057,8 @@ brikz.classes = ClassesBrik;
 brikz.methods = MethodsBrik;
 brikz.stInit = SmalltalkInitBrik;
 brikz.augments = AugmentsBrik;
-brikz.bootstrap = BootstrapBrik;
 
 brikz.rebuild();
-brikz.bootstrap.bootstrap();
 
 global_smalltalk = api;
 global_nil = nil;