Browse Source

kernel: coreFns, __init__s out, addCoupledClass out

Herbert Vojčík 7 years ago
parent
commit
ebde5a306d
1 changed files with 31 additions and 92 deletions
  1. 31 92
      support/boot.js

+ 31 - 92
support/boot.js

@@ -64,6 +64,8 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
     function RootBrik (brikz, st) {
         /* Smalltalk foundational objects */
 
+        var coreFns = this.coreFns = {};
+
         /* SmalltalkRoot is the hidden root of the normal Amber hierarchy.
          All objects including `ProtoObject` inherit from SmalltalkRoot.
          Detached roots (eg. wrapped JS classes like Number or Date)
@@ -77,25 +79,17 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         function SmalltalkObject () {
         }
 
-        inherits(SmalltalkProtoObject, SmalltalkRoot);
-        inherits(SmalltalkObject, SmalltalkProtoObject);
+        coreFns.ProtoObject = inherits(SmalltalkProtoObject, SmalltalkRoot);
+        coreFns.Object = inherits(SmalltalkObject, SmalltalkProtoObject);
 
         this.Root = SmalltalkRoot;
         this.Object = SmalltalkObject;
-
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
-            st.addPackage("Kernel-Objects");
-            addCoupledClass("ProtoObject", undefined, "Kernel-Objects", SmalltalkProtoObject);
-            addCoupledClass("Object", globals.ProtoObject, "Kernel-Objects", SmalltalkObject);
-        };
-        this.__init__.once = true;
     }
 
     OrganizeBrik.deps = ["arraySet", "root"];
     function OrganizeBrik (brikz, st) {
         var SmalltalkObject = brikz.root.Object;
+        var coreFns = brikz.root.coreFns;
         var addElement = brikz.arraySet.addElement;
         var removeElement = brikz.arraySet.removeElement;
 
@@ -110,19 +104,9 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             this.elements = [];
         }
 
-        inherits(SmalltalkOrganizer, SmalltalkObject);
-        inherits(SmalltalkPackageOrganizer, SmalltalkOrganizer);
-        inherits(SmalltalkClassOrganizer, SmalltalkOrganizer);
-
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
-            st.addPackage("Kernel-Infrastructure");
-            addCoupledClass("Organizer", globals.Object, "Kernel-Infrastructure", SmalltalkOrganizer);
-            addCoupledClass("PackageOrganizer", globals.Organizer, "Kernel-Infrastructure", SmalltalkPackageOrganizer);
-            addCoupledClass("ClassOrganizer", globals.Organizer, "Kernel-Infrastructure", SmalltalkClassOrganizer);
-        };
-        this.__init__.once = true;
+        coreFns.Organizer = inherits(SmalltalkOrganizer, SmalltalkObject);
+        coreFns.PackageOrganizer = inherits(SmalltalkPackageOrganizer, SmalltalkOrganizer);
+        coreFns.ClassOrganizer = inherits(SmalltalkClassOrganizer, SmalltalkOrganizer);
 
         this.setupClassOrganization = function (behaviorBody) {
             behaviorBody.organization = new SmalltalkClassOrganizer();
@@ -167,19 +151,12 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
     function PackagesBrik (brikz, st) {
         var setupPackageOrganization = brikz.organize.setupPackageOrganization;
         var SmalltalkObject = brikz.root.Object;
+        var coreFns = brikz.root.coreFns;
 
         function SmalltalkPackage () {
         }
 
-        inherits(SmalltalkPackage, SmalltalkObject);
-
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
-            st.addPackage("Kernel-Infrastructure");
-            addCoupledClass("Package", globals.Object, "Kernel-Infrastructure", SmalltalkPackage);
-        };
-        this.__init__.once = true;
+        coreFns.Package = inherits(SmalltalkPackage, SmalltalkObject);
 
         st.packages = {};
 
@@ -220,24 +197,17 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         var removeOrganizationElement = brikz.organize.removeOrganizationElement;
         var globals = brikz.smalltalkGlobals.globals;
         var SmalltalkObject = brikz.root.Object;
+        var coreFns = brikz.root.coreFns;
         var addElement = brikz.arraySet.addElement;
         var removeElement = brikz.arraySet.removeElement;
 
         function SmalltalkBehaviorBody () {
         }
 
-        inherits(SmalltalkBehaviorBody, SmalltalkObject);
+        coreFns.BehaviorBody = inherits(SmalltalkBehaviorBody, SmalltalkObject);
 
         this.BehaviorBody = SmalltalkBehaviorBody;
 
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
-            st.addPackage("Kernel-Classes");
-            addCoupledClass("BehaviorBody", globals.Object, "Kernel-Classes", SmalltalkBehaviorBody);
-        };
-        this.__init__.once = true;
-
         /* Smalltalk classes */
 
         var classes = [];
@@ -307,19 +277,12 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         var addOrganizationElement = brikz.organize.addOrganizationElement;
         var registerSelector = brikz.selectors.registerSelector;
         var SmalltalkObject = brikz.root.Object;
+        var coreFns = brikz.root.coreFns;
 
         function SmalltalkMethod () {
         }
 
-        inherits(SmalltalkMethod, SmalltalkObject);
-
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
-            st.addPackage("Kernel-Methods");
-            addCoupledClass("CompiledMethod", globals.Object, "Kernel-Methods", SmalltalkMethod);
-        };
-        this.__init__.once = true;
+        coreFns.CompiledMethod = inherits(SmalltalkMethod, SmalltalkObject);
 
         /* Smalltalk method object. To add a method to a class,
          use api.addMethod() */
@@ -376,8 +339,9 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         };
     }
 
-    TraitsBrik.deps = ["behaviors"];
+    TraitsBrik.deps = ["behaviors", "root"];
     function TraitsBrik (brikz, st) {
+        var coreFns = brikz.root.coreFns;
         var SmalltalkBehaviorBody = brikz.behaviors.BehaviorBody;
         var setupBehavior = brikz.behaviors.setupBehavior;
         var buildBehaviorBody = brikz.behaviors.buildBehaviorBody;
@@ -385,7 +349,7 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         function SmalltalkTrait () {
         }
 
-        inherits(SmalltalkTrait, SmalltalkBehaviorBody);
+        coreFns.Trait = inherits(SmalltalkTrait, SmalltalkBehaviorBody);
 
         SmalltalkTrait.prototype.toString = function () {
             return 'Smalltalk Trait ' + this.className;
@@ -409,14 +373,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             if (st._traitMethodRemoved) st._traitMethodRemoved(method, this);
         };
 
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
-            st.addPackage("Kernel-Classes");
-            addCoupledClass("Trait", globals.BehaviorBody, "Kernel-Classes", SmalltalkTrait);
-        };
-        this.__init__.once = true;
-
         function traitBuilder (className) {
             return {
                 className: className,
@@ -441,9 +397,11 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         };
     }
 
-    ClassesBrik.deps = ["root", "behaviors", "arraySet"];
+    ClassesBrik.deps = ["root", "behaviors", "arraySet", "smalltalkGlobals"];
     function ClassesBrik (brikz, st) {
         var SmalltalkRoot = brikz.root.Root;
+        var coreFns = brikz.root.coreFns;
+        var globals = brikz.smalltalkGlobals.globals;
         var SmalltalkBehaviorBody = brikz.behaviors.BehaviorBody;
         var buildBehaviorBody = brikz.behaviors.buildBehaviorBody;
         var setupBehavior = brikz.behaviors.setupBehavior;
@@ -460,9 +418,9 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         function SmalltalkMetaclass () {
         }
 
-        inherits(SmalltalkBehavior, SmalltalkBehaviorBody);
-        inherits(SmalltalkClass, SmalltalkBehavior);
-        inherits(SmalltalkMetaclass, SmalltalkBehavior);
+        coreFns.Behavior = inherits(SmalltalkBehavior, SmalltalkBehaviorBody);
+        coreFns.Class = inherits(SmalltalkClass, SmalltalkBehavior);
+        coreFns.Metaclass = inherits(SmalltalkMetaclass, SmalltalkBehavior);
 
         // Fake root class of the system.
         // Effective superclass of all classes created with `nil subclass: ...`.
@@ -496,23 +454,14 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             if (st._methodRemoved) st._methodRemoved(method, this);
         };
 
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
+        this.bootstrapHierarchy = function () {
             var nilSubclasses = [globals.ProtoObject];
-            st.addPackage("Kernel-Classes");
-            addCoupledClass("Behavior", globals.BehaviorBody, "Kernel-Classes", SmalltalkBehavior);
-            addCoupledClass("Metaclass", globals.Behavior, "Kernel-Classes", SmalltalkMetaclass);
-            addCoupledClass("Class", globals.Behavior, "Kernel-Classes", SmalltalkClass);
-
-            // Manually bootstrap the metaclass hierarchy
             nilAsClass.klass = globals.Class;
             nilSubclasses.forEach(function (each) {
                 each.klass.superclass = globals.Class;
                 addSubclass(each.klass);
             });
         };
-        this.__init__.once = true;
 
         /* Smalltalk class creation. A class is an instance of an automatically
          created metaclass object. Newly created classes (not their metaclass)
@@ -571,7 +520,7 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             if (typeof superclass == 'undefined' || superclass && superclass.isNil) {
                 console.warn('Compiling ' + className + ' as a subclass of `nil`. A dependency might be missing.');
             }
-            return buildBehaviorBody(pkgName, classBuilder(className, superclass, iVarNames));
+            return buildBehaviorBody(pkgName, classBuilder(className, superclass, iVarNames, coreFns[className]));
         };
 
         function classBuilder (className, superclass, iVarNames, fn) {
@@ -620,13 +569,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             }
         }
 
-        /* Create a new class coupling with a JavaScript constructor,
-         and add it to the system.*/
-
-        this.addCoupledClass = function (className, superclass, pkgName, fn) {
-            return buildBehaviorBody(pkgName, classBuilder(className, superclass, null, fn));
-        };
-
         function metaSubclasses (metaclass) {
             return metaclass.instanceClass.subclasses
                 .filter(function (each) {
@@ -668,7 +610,10 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         };
     }
 
+    SmalltalkInitBrik.deps = ["classes"];
     function SmalltalkInitBrik (brikz, st) {
+        var bootstrapHierarchy = brikz.classes.bootstrapHierarchy;
+
         var initialized = false;
         var runtimeLoadedPromise = new Promise(function (resolve, reject) {
             require(['./kernel-runtime'], resolve, reject);
@@ -679,6 +624,7 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         st.initialize = function () {
             return runtimeLoadedPromise.then(function (configureWithRuntime) {
                 if (initialized) return;
+                bootstrapHierarchy();
                 configureWithRuntime(brikz);
                 initialized = true;
             });
@@ -754,11 +700,12 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
     NilBrik.deps = ["root"];
     function NilBrik (brikz, st) {
         var SmalltalkObject = brikz.root.Object;
+        var coreFns = brikz.root.coreFns;
 
         function SmalltalkNil () {
         }
 
-        inherits(SmalltalkNil, SmalltalkObject);
+        coreFns.UndefinedObject = inherits(SmalltalkNil, SmalltalkObject);
 
         this.nilAsReceiver = new SmalltalkNil();
 
@@ -771,14 +718,6 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
             value: true,
             enumerable: false, configurable: false, writable: false
         });
-
-        this.__init__ = function () {
-            var globals = brikz.smalltalkGlobals.globals;
-            var addCoupledClass = brikz.classes.addCoupledClass;
-            st.addPackage("Kernel-Objects");
-            addCoupledClass("UndefinedObject", globals.Object, "Kernel-Objects", SmalltalkNil);
-        };
-        this.__init__.once = true;
     }
 
     /* Defines asReceiver to be present at load time */