Browse Source

kernel: prunable traverseClassTree.

Use it to optimize propagateMethodChange and stop it
whenever method is defined locally.
Herbert Vojčík 7 years ago
parent
commit
c557503f72
2 changed files with 6 additions and 5 deletions
  1. 2 2
      support/boot.js
  2. 4 3
      support/kernel-runtime.js

+ 2 - 2
support/boot.js

@@ -463,10 +463,10 @@ define(['require', './brikz', './compatibility'], function (require, Brikz) {
         st.metaSubclasses = metaSubclasses;
 
         st.traverseClassTree = function (klass, fn) {
-            var queue = [klass];
+            var queue = [klass], sentinel = {};
             for (var i = 0; i < queue.length; ++i) {
                 var item = queue[i];
-                fn(item);
+                if (fn(item, sentinel) === sentinel) continue;
                 var subclasses = item.meta ? metaSubclasses(item) : item.subclasses;
                 queue.push.apply(queue, subclasses);
             }

+ 4 - 3
support/kernel-runtime.js

@@ -163,15 +163,16 @@ define(function () {
         function propagateMethodChange(klass, method, exclude) {
             var selector = method.selector;
             var jsSelector = method.jsSelector;
-            st.traverseClassTree(klass, function (subclass) {
+            st.traverseClassTree(klass, function (subclass, sentinel) {
                 if (subclass != exclude) {
-                    initMethodInClass(subclass, selector, jsSelector);
+                    if (initMethodInClass(subclass, selector, jsSelector)) return sentinel;
                 }
             });
         }
 
         function initMethodInClass(klass, selector, jsSelector) {
-            if (klass.detachedRoot && !klass.methods[selector]) {
+            if (klass.methods[selector]) return true;
+            if (klass.detachedRoot) {
                 installJSMethod(klass.fn.prototype, jsSelector, klass.superclass.fn.prototype[jsSelector]);
             }
         }