Browse Source

kernel: Split big brik (ClassesBrik).

Herby Vojčík 4 years ago
parent
commit
068f9bb943
3 changed files with 102 additions and 83 deletions
  1. 3 3
      lang/base/boot.js
  2. 95 76
      lang/base/kernel-language.js
  3. 4 4
      lang/base/kernel-runtime.js

+ 3 - 3
lang/base/boot.js

@@ -61,7 +61,7 @@ define([
         st.initialize = function () {
             return runtimeLoadedPromise.then(function (RuntimeFactory) {
                 if (initialized) return;
-                brikz.classes.bootstrapHierarchy(globals.Class);
+                brikz.classModel.bootstrapHierarchy(globals.Class);
                 RuntimeFactory(globals, emit).configure(brikz);
                 return Promise.resolve(brikz.startImage.run())
                     .then(function () {
@@ -96,8 +96,8 @@ define([
         api: api,
         nilAsReceiver: brikz.nil.nilAsReceiver,
         nilAsValue: brikz.nil.nilAsValue,
-        nilAsClass: brikz.classes.nilAsClass,
+        nilAsClass: brikz.classModel.nilAsClass,
         globals: globals,
-        asReceiver: brikz.classes.asReceiver
+        asReceiver: brikz.classModel.asReceiver
     };
 });

+ 95 - 76
lang/base/kernel-language.js

@@ -203,14 +203,11 @@ define(['./junk-drawer'], function ($goodies) {
             };
         }
 
-        ClassesBrik.deps = ["root", "behaviorals", "methods", "nil"];
+        ClassModelBrik.deps = ["root", "nil"];
 
-        function ClassesBrik (brikz, st) {
+        function ClassModelBrik (brikz, st) {
             var SmalltalkRoot = brikz.root.Root;
             var SmalltalkObject = brikz.root.Object;
-            var buildTraitOrClass = brikz.behaviorals.buildTraitOrClass;
-            var setupMethods = brikz.methods.setupMethods;
-            var removeTraitOrClass = brikz.behaviorals.removeTraitOrClass;
             var nilAsReceiver = brikz.nil.nilAsReceiver;
 
             function SmalltalkBehavior () {
@@ -222,18 +219,14 @@ define(['./junk-drawer'], function ($goodies) {
             function SmalltalkMetaclass () {
             }
 
+            this.newMetaclass = function () {
+                return new SmalltalkMetaclass();
+            };
+
             specialConstructors.Behavior = inherits(SmalltalkBehavior, SmalltalkObject);
             specialConstructors.Class = inherits(SmalltalkClass, SmalltalkBehavior);
             specialConstructors.Metaclass = inherits(SmalltalkMetaclass, SmalltalkBehavior);
 
-            // Fake root class of the system.
-            // Effective superclass of all classes created with `nil subclass: ...`.
-            var nilAsClass = this.nilAsClass = {
-                fn: SmalltalkRoot,
-                subclasses: [],
-                a$cls: {fn: SmalltalkClass}
-            };
-
             SmalltalkMetaclass.prototype.meta = true;
             declareJsMethod(SmalltalkClass.prototype, "toString");
             declareJsMethod(SmalltalkMetaclass.prototype, "toString");
@@ -272,6 +265,82 @@ define(['./junk-drawer'], function ($goodies) {
                 emit.behaviorMethodRemoved(method, this);
             };
 
+            // Fake root class of the system.
+            // Effective superclass of all classes created with `nil subclass: ...`.
+            var nilAsClass = this.nilAsClass = {
+                fn: SmalltalkRoot,
+                subclasses: [],
+                a$cls: {fn: SmalltalkClass}
+            };
+
+            this.bootstrapHierarchy = function (realClass) {
+                nilAsClass.a$cls = realClass;
+                nilAsClass.subclasses.forEach(function (each) {
+                    each.a$cls.superclass = realClass;
+                    registerToSuperclass(each.a$cls);
+                });
+            };
+
+            function registerToSuperclass (klass) {
+                addElement((klass.superclass || nilAsClass).subclasses, klass);
+            }
+
+            function unregisterFromSuperclass (klass) {
+                removeElement((klass.superclass || nilAsClass).subclasses, klass);
+            }
+
+            function metaSubclasses (metaclass) {
+                return metaclass.instanceClass.subclasses
+                    .filter(function (each) {
+                        return !each.meta;
+                    })
+                    .map(function (each) {
+                        return each.a$cls;
+                    });
+            }
+
+            st.metaSubclasses = metaSubclasses;
+
+            st.traverseClassTree = function (klass, fn) {
+                var queue = [klass], sentinel = {};
+                for (var i = 0; i < queue.length; ++i) {
+                    var item = queue[i];
+                    if (fn(item, sentinel) === sentinel) continue;
+                    var subclasses = item.meta ? metaSubclasses(item) : item.subclasses;
+                    queue.push.apply(queue, subclasses);
+                }
+            };
+
+            /**
+             * This function is used all over the compiled amber code.
+             * It takes any value (JavaScript or Smalltalk)
+             * and returns a proper Amber Smalltalk receiver.
+             *
+             * null or undefined -> nilAsReceiver,
+             * object having Smalltalk signature -> unchanged,
+             * otherwise wrapped foreign (JS) object
+             */
+            this.asReceiver = function (o) {
+                if (o == null) return nilAsReceiver;
+                else if (o.a$cls != null) return o;
+                else return st.wrapJavaScript(o);
+            };
+
+            // TODO remove, .iVarNames backward compatibility
+            this.__init__ = function () {
+                brikz.classConstruction.iVarNamesCompat(SmalltalkBehavior);
+            };
+        }
+
+        ClassConstructionBrik.deps = ["classModel", "behaviorals", "methods"];
+
+        function ClassConstructionBrik (brikz, st) {
+            var nilAsClass = brikz.classModel.nilAsClass;
+            var newMetaclass = brikz.classModel.newMetaclass;
+            var buildTraitOrClass = brikz.behaviorals.buildTraitOrClass;
+            var setupMethods = brikz.methods.setupMethods;
+            var removeTraitOrClass = brikz.behaviorals.removeTraitOrClass;
+
             declareEvent("slotsChanged");
 
             function setSlots (klass, slots) {
@@ -287,22 +356,16 @@ define(['./junk-drawer'], function ($goodies) {
             st.setSlots = setSlots;
 
             // TODO remove, .iVarNames backward compatibility
-            Object.defineProperty(SmalltalkBehavior.prototype, "iVarNames", {
-                enumerable: true,
-                configurable: true,
-                get: function () {
-                    return this.slots;
-                },
-                set: function (instanceVariableNames) {
-                    setSlots(this, instanceVariableNames);
-                }
-            });
-
-            this.bootstrapHierarchy = function (realClass) {
-                nilAsClass.a$cls = realClass;
-                nilAsClass.subclasses.forEach(function (each) {
-                    each.a$cls.superclass = realClass;
-                    registerToSuperclass(each.a$cls);
+            this.iVarNamesCompat = function (SmalltalkBehavior) {
+                Object.defineProperty(SmalltalkBehavior.prototype, "iVarNames", {
+                    enumerable: true,
+                    configurable: true,
+                    get: function () {
+                        return this.slots;
+                    },
+                    set: function (instanceVariableNames) {
+                        setSlots(this, instanceVariableNames);
+                    }
                 });
             };
 
@@ -335,7 +398,7 @@ define(['./junk-drawer'], function ($goodies) {
                 }
 
                 function metaclass () {
-                    var that = new SmalltalkMetaclass();
+                    var that = newMetaclass();
 
                     that.superclass = superclass.a$cls;
                     that.fn = inherits(function () {
@@ -368,21 +431,6 @@ define(['./junk-drawer'], function ($goodies) {
 
             this.wireKlass = wireKlass;
 
-            /**
-             * This function is used all over the compiled amber code.
-             * It takes any value (JavaScript or Smalltalk)
-             * and returns a proper Amber Smalltalk receiver.
-             *
-             * null or undefined -> nilAsReceiver,
-             * object having Smalltalk signature -> unchanged,
-             * otherwise wrapped foreign (JS) object
-             */
-            this.asReceiver = function (o) {
-                if (o == null) return nilAsReceiver;
-                else if (o.a$cls != null) return o;
-                else return st.wrapJavaScript(o);
-            };
-
             /* Add a class to the system, creating a new one if needed.
              A Package is lazily created if one with given name does not exist. */
 
@@ -403,36 +451,6 @@ define(['./junk-drawer'], function ($goodies) {
             };
 
             st.removeClass = removeTraitOrClass;
-
-            function registerToSuperclass (klass) {
-                addElement((klass.superclass || nilAsClass).subclasses, klass);
-            }
-
-            function unregisterFromSuperclass (klass) {
-                removeElement((klass.superclass || nilAsClass).subclasses, klass);
-            }
-
-            function metaSubclasses (metaclass) {
-                return metaclass.instanceClass.subclasses
-                    .filter(function (each) {
-                        return !each.meta;
-                    })
-                    .map(function (each) {
-                        return each.a$cls;
-                    });
-            }
-
-            st.metaSubclasses = metaSubclasses;
-
-            st.traverseClassTree = function (klass, fn) {
-                var queue = [klass], sentinel = {};
-                for (var i = 0; i < queue.length; ++i) {
-                    var item = queue[i];
-                    if (fn(item, sentinel) === sentinel) continue;
-                    var subclasses = item.meta ? metaSubclasses(item) : item.subclasses;
-                    queue.push.apply(queue, subclasses);
-                }
-            };
         }
 
         /* Making smalltalk that can load */
@@ -440,7 +458,8 @@ define(['./junk-drawer'], function ($goodies) {
         function configure (brikz) {
             brikz.traits = TraitsBrik;
             brikz.composition = MethodCompositionBrik;
-            brikz.classes = ClassesBrik;
+            brikz.classModel = ClassModelBrik;
+            brikz.classConstruction = ClassConstructionBrik;
 
             brikz();
         }

+ 4 - 4
lang/base/kernel-runtime.js

@@ -31,11 +31,11 @@ define(['./junk-drawer'], function ($goodies) {
     }
 
     function RuntimeFactory (globals, emit) {
-        RuntimeSelectorsBrik.deps = ["selectors", "selectorConversion", "classes"];
+        RuntimeSelectorsBrik.deps = ["selectors", "selectorConversion", "classModel"];
 
         function RuntimeSelectorsBrik (brikz, st) {
             var selectors = brikz.selectors.selectors;
-            var nilAsClass = brikz.classes.nilAsClass;
+            var nilAsClass = brikz.classModel.nilAsClass;
             var st2js = brikz.selectorConversion.st2js;
 
             var jsSelectors = this.jsSelectors = [];
@@ -69,14 +69,14 @@ define(['./junk-drawer'], function ($goodies) {
             installNewSelectors(selectors, []);
         }
 
-        RuntimeClassesBrik.deps = ["runtimeSelectors", "behaviorals", "classes", "runtimeMethods"];
+        RuntimeClassesBrik.deps = ["runtimeSelectors", "behaviorals", "classConstruction", "runtimeMethods"];
 
         function RuntimeClassesBrik (brikz, st) {
             var jsSelectors = brikz.runtimeSelectors.jsSelectors;
             var installNewSelectors = brikz.runtimeSelectors.installNewSelectors;
             var installAmberMethodIntoAmberClass = brikz.runtimeMethods.installAmberMethodIntoAmberClass;
             var traitsOrClasses = brikz.behaviorals.traitsOrClasses;
-            var wireKlass = brikz.classes.wireKlass;
+            var wireKlass = brikz.classConstruction.wireKlass;
 
             var detachedRootClasses = [];