Browse Source

kernel: Refactor slots initialization.

Herby Vojčík 4 years ago
parent
commit
b9ff33f25a
2 changed files with 30 additions and 21 deletions
  1. 2 19
      lang/base/kernel-language.js
  2. 28 2
      lang/base/kernel-runtime.js

+ 2 - 19
lang/base/kernel-language.js

@@ -272,24 +272,7 @@ define(['./junk-drawer'], function ($goodies) {
                 emit.behaviorMethodRemoved(method, this);
             };
 
-            // TODO remove, ["@foo"] backward compatibility
-            function installIvarCompat (klass) {
-                var ivars = klass.slots;
-                ivars.forEach(function (ivar) {
-                    Object.defineProperty(klass.fn.prototype, "@" + ivar, {
-                        get: function () {
-                            return this[ivar];
-                        },
-                        set: function (value) {
-                            return this[ivar] = value;
-                        },
-                        enumerable: false,
-                        configurable: true
-                    });
-                });
-            }
-
-            this.installIvarCompat = installIvarCompat;
+            declareEvent("slotsChanged");
 
             function setSlots (klass, slots) {
                 slots.forEach(function (name) {
@@ -298,7 +281,7 @@ define(['./junk-drawer'], function ($goodies) {
                 });
 
                 klass.slots = slots;
-                installIvarCompat(klass);
+                emit.slotsChanged(klass);
             }
 
             st.setSlots = setSlots;

+ 28 - 2
lang/base/kernel-runtime.js

@@ -77,7 +77,6 @@ define(['./junk-drawer'], function ($goodies) {
             var installAmberMethodIntoAmberClass = brikz.runtimeMethods.installAmberMethodIntoAmberClass;
             var traitsOrClasses = brikz.behaviors.traitsOrClasses;
             var wireKlass = brikz.classes.wireKlass;
-            var installIvarCompat = brikz.classes.installIvarCompat;
 
             var detachedRootClasses = [];
 
@@ -130,14 +129,25 @@ define(['./junk-drawer'], function ($goodies) {
 
             emit.classAdded = initClassAndMetaclass;
 
+            emit.slotsChanged = initClassSlots;
+
             function initClass (klass) {
                 wireKlass(klass);
+                initClassMethods(klass);
+                initClassSlots(klass);
+            }
+
+            function initClassMethods (klass) {
                 if (klass.detachedRoot) {
                     copySuperclass(klass);
                 }
                 installMethods(klass);
             }
 
+            function initClassSlots (klass) {
+                installIvarCompat(klass);
+            }
+
             function copySuperclass (klass) {
                 var myproto = klass.fn.prototype,
                     superproto = klass.superclass.fn.prototype;
@@ -153,6 +163,23 @@ define(['./junk-drawer'], function ($goodies) {
                 });
             }
 
+            // TODO remove, ["@foo"] backward compatibility
+            function installIvarCompat (klass) {
+                var ivars = klass.slots;
+                ivars.forEach(function (ivar) {
+                    Object.defineProperty(klass.fn.prototype, "@" + ivar, {
+                        get: function () {
+                            return this[ivar];
+                        },
+                        set: function (value) {
+                            return this[ivar] = value;
+                        },
+                        enumerable: false,
+                        configurable: true
+                    });
+                });
+            }
+
             /* Create an alias for an existing class */
 
             st.alias = function (traitOrClass, alias) {
@@ -164,7 +191,6 @@ define(['./junk-drawer'], function ($goodies) {
             st.setClassConstructor = this.setClassConstructor = function (klass, constructor) {
                 klass.fn = constructor;
                 detachClass(klass);
-                installIvarCompat(klass);
                 klass.subclasses.forEach(reprotoFn(constructor));
             };