Browse Source

kernel: Move independent brikz out.

Herby Vojčík 4 years ago
parent
commit
0c00f09c56
3 changed files with 235 additions and 235 deletions
  1. 43 43
      lang/base/kernel-fundamentals.js
  2. 121 121
      lang/base/kernel-language.js
  3. 71 71
      lang/base/kernel-runtime.js

+ 43 - 43
lang/base/kernel-fundamentals.js

@@ -13,6 +13,49 @@ define(function () {
         return child;
     }
 
+    function SelectorsBrik (brikz, st) {
+        var selectorSet = Object.create(null);
+        var selectors = this.selectors = [];
+
+        this.registerSelector = function (stSelector) {
+            if (selectorSet[stSelector]) return false;
+            selectors.push(stSelector);
+            return selectorSet[stSelector] = true;
+        };
+
+        st.allSelectors = function () {
+            return selectors;
+        };
+    }
+
+    function PackagesBrik (brikz, st) {
+        st.packageDescriptors = {};
+
+        /* Add a package load descriptor to the system */
+        st.addPackage = function (name, properties) {
+            if (!name) return null;
+            return st.packageDescriptors[name] = {properties: properties};
+        };
+    }
+
+    function ArraySetBrik (brikz, st) {
+        st.addElement = this.addElement = function (array, el) {
+            if (typeof el === 'undefined') {
+                return;
+            }
+            if (array.indexOf(el) === -1) {
+                array.push(el);
+            }
+        };
+
+        st.removeElement = this.removeElement = function (array, el) {
+            var i = array.indexOf(el);
+            if (i !== -1) {
+                array.splice(i, 1);
+            }
+        };
+    }
+
     function FundamentalsFactory (globals, emit) {
         var specialConstructors = Object.create(null);
 
@@ -46,31 +89,6 @@ define(function () {
             this.Object = SmalltalkObject;
         }
 
-        function SelectorsBrik (brikz, st) {
-            var selectorSet = Object.create(null);
-            var selectors = this.selectors = [];
-
-            this.registerSelector = function (stSelector) {
-                if (selectorSet[stSelector]) return false;
-                selectors.push(stSelector);
-                return selectorSet[stSelector] = true;
-            };
-
-            st.allSelectors = function () {
-                return selectors;
-            };
-        }
-
-        function PackagesBrik (brikz, st) {
-            st.packageDescriptors = {};
-
-            /* Add a package load descriptor to the system */
-            st.addPackage = function (name, properties) {
-                if (!name) return null;
-                return st.packageDescriptors[name] = {properties: properties};
-            };
-        }
-
         BehaviorsBrik.deps = ["root", "arraySet"];
 
         function BehaviorsBrik (brikz, st) {
@@ -211,24 +229,6 @@ define(function () {
             this.updateMethod = updateMethod;
         }
 
-        function ArraySetBrik (brikz, st) {
-            st.addElement = this.addElement = function (array, el) {
-                if (typeof el === 'undefined') {
-                    return;
-                }
-                if (array.indexOf(el) === -1) {
-                    array.push(el);
-                }
-            };
-
-            st.removeElement = this.removeElement = function (array, el) {
-                var i = array.indexOf(el);
-                if (i !== -1) {
-                    array.splice(i, 1);
-                }
-            };
-        }
-
         NilBrik.deps = ["root"];
 
         function NilBrik (brikz, st) {

+ 121 - 121
lang/base/kernel-language.js

@@ -20,6 +20,127 @@ define(function () {
         });
     }
 
+    MethodCompositionBrik.deps = ["methods", "arraySet"];
+
+    function MethodCompositionBrik (brikz, st) {
+        var updateMethod = brikz.methods.updateMethod;
+        var addElement = brikz.arraySet.addElement;
+        var removeElement = brikz.arraySet.removeElement;
+
+        function aliased (selector, method) {
+            var result = st.method(method, method.instantiateFn);
+            if (method.selector !== selector) {
+                result.selector = selector;
+                result.source = '"Aliased as ' + selector + '"\n' + method.source;
+            }
+            result.owner = method.owner;
+            return result;
+        }
+
+        function deleteKeysFrom (keys, obj) {
+            keys.forEach(function (each) {
+                delete obj[each];
+            });
+        }
+
+        function fillTraitTransformation (traitTransformation, obj) {
+            // assert(Object.getOwnProperties(obj).length === 0)
+            var traitMethods = traitTransformation.trait.methods;
+            Object.keys(traitMethods).forEach(function (selector) {
+                obj[selector] = aliased(selector, traitMethods[selector]);
+            });
+            var traitAliases = traitTransformation.aliases;
+            if (traitAliases) {
+                Object.keys(traitAliases).forEach(function (aliasSelector) {
+                    var aliasedMethod = traitMethods[traitAliases[aliasSelector]];
+                    if (aliasedMethod) obj[aliasSelector] = aliased(aliasSelector, aliasedMethod);
+                    // else delete obj[aliasSelector]; // semantically correct; optimized away
+                });
+            }
+            var traitExclusions = traitTransformation.exclusions;
+            if (traitExclusions) {
+                deleteKeysFrom(traitExclusions, obj);
+            }
+            return obj;
+        }
+
+        function buildCompositionChain (traitComposition) {
+            return traitComposition.reduce(function (soFar, each) {
+                return fillTraitTransformation(each, Object.create(soFar));
+            }, null);
+        }
+
+        st.setTraitComposition = function (traitComposition, traitOrBehavior) {
+            var oldLocalMethods = traitOrBehavior.localMethods,
+                newLocalMethods = Object.create(buildCompositionChain(traitComposition));
+            Object.keys(oldLocalMethods).forEach(function (selector) {
+                newLocalMethods[selector] = oldLocalMethods[selector];
+            });
+            var selector;
+            traitOrBehavior.localMethods = newLocalMethods;
+            for (selector in newLocalMethods) {
+                updateMethod(selector, traitOrBehavior);
+            }
+            for (selector in oldLocalMethods) {
+                updateMethod(selector, traitOrBehavior);
+            }
+            (traitOrBehavior.traitComposition || []).forEach(function (each) {
+                removeElement(each.trait.traitUsers, traitOrBehavior);
+            });
+            traitOrBehavior.traitComposition = traitComposition && traitComposition.length ? traitComposition : null;
+            (traitOrBehavior.traitComposition || []).forEach(function (each) {
+                addElement(each.trait.traitUsers, traitOrBehavior);
+            });
+        };
+
+        function aliasesOfSelector (selector, traitAliases) {
+            if (!traitAliases) return [selector];
+            var result = Object.keys(traitAliases).filter(function (aliasSelector) {
+                return traitAliases[aliasSelector] === selector
+            });
+            if (!traitAliases[selector]) result.push(selector);
+            return result;
+        }
+
+        function applyTraitMethodAddition (selector, method, traitTransformation, obj) {
+            var changes = aliasesOfSelector(selector, traitTransformation.aliases);
+            changes.forEach(function (aliasSelector) {
+                obj[aliasSelector] = aliased(aliasSelector, method);
+            });
+            var traitExclusions = traitTransformation.exclusions;
+            if (traitExclusions) {
+                deleteKeysFrom(traitExclusions, obj);
+            }
+            return changes;
+        }
+
+        function applyTraitMethodDeletion (selector, traitTransformation, obj) {
+            var changes = aliasesOfSelector(selector, traitTransformation.aliases);
+            deleteKeysFrom(changes, obj);
+            return changes;
+        }
+
+        function traitMethodChanged (selector, method, trait, traitOrBehavior) {
+            var traitComposition = traitOrBehavior.traitComposition,
+                chain = traitOrBehavior.localMethods,
+                changes = [];
+            for (var i = traitComposition.length - 1; i >= 0; --i) {
+                chain = Object.getPrototypeOf(chain);
+                var traitTransformation = traitComposition[i];
+                if (traitTransformation.trait !== trait) continue;
+                changes.push.apply(changes, method ?
+                    applyTraitMethodAddition(selector, method, traitTransformation, chain) :
+                    applyTraitMethodDeletion(selector, traitTransformation, chain));
+            }
+            // assert(chain === null);
+            changes.forEach(function (each) {
+                updateMethod(each, traitOrBehavior);
+            });
+        }
+
+        this.traitMethodChanged = traitMethodChanged;
+    }
+
     function LanguageFactory (specialConstructors, emit) {
         TraitsBrik.deps = ["event", "behaviors", "methods", "composition", "root"];
 
@@ -85,127 +206,6 @@ define(function () {
             };
         }
 
-        MethodCompositionBrik.deps = ["methods", "arraySet"];
-
-        function MethodCompositionBrik (brikz, st) {
-            var updateMethod = brikz.methods.updateMethod;
-            var addElement = brikz.arraySet.addElement;
-            var removeElement = brikz.arraySet.removeElement;
-
-            function aliased (selector, method) {
-                var result = st.method(method, method.instantiateFn);
-                if (method.selector !== selector) {
-                    result.selector = selector;
-                    result.source = '"Aliased as ' + selector + '"\n' + method.source;
-                }
-                result.owner = method.owner;
-                return result;
-            }
-
-            function deleteKeysFrom (keys, obj) {
-                keys.forEach(function (each) {
-                    delete obj[each];
-                });
-            }
-
-            function fillTraitTransformation (traitTransformation, obj) {
-                // assert(Object.getOwnProperties(obj).length === 0)
-                var traitMethods = traitTransformation.trait.methods;
-                Object.keys(traitMethods).forEach(function (selector) {
-                    obj[selector] = aliased(selector, traitMethods[selector]);
-                });
-                var traitAliases = traitTransformation.aliases;
-                if (traitAliases) {
-                    Object.keys(traitAliases).forEach(function (aliasSelector) {
-                        var aliasedMethod = traitMethods[traitAliases[aliasSelector]];
-                        if (aliasedMethod) obj[aliasSelector] = aliased(aliasSelector, aliasedMethod);
-                        // else delete obj[aliasSelector]; // semantically correct; optimized away
-                    });
-                }
-                var traitExclusions = traitTransformation.exclusions;
-                if (traitExclusions) {
-                    deleteKeysFrom(traitExclusions, obj);
-                }
-                return obj;
-            }
-
-            function buildCompositionChain (traitComposition) {
-                return traitComposition.reduce(function (soFar, each) {
-                    return fillTraitTransformation(each, Object.create(soFar));
-                }, null);
-            }
-
-            st.setTraitComposition = function (traitComposition, traitOrBehavior) {
-                var oldLocalMethods = traitOrBehavior.localMethods,
-                    newLocalMethods = Object.create(buildCompositionChain(traitComposition));
-                Object.keys(oldLocalMethods).forEach(function (selector) {
-                    newLocalMethods[selector] = oldLocalMethods[selector];
-                });
-                var selector;
-                traitOrBehavior.localMethods = newLocalMethods;
-                for (selector in newLocalMethods) {
-                    updateMethod(selector, traitOrBehavior);
-                }
-                for (selector in oldLocalMethods) {
-                    updateMethod(selector, traitOrBehavior);
-                }
-                (traitOrBehavior.traitComposition || []).forEach(function (each) {
-                    removeElement(each.trait.traitUsers, traitOrBehavior);
-                });
-                traitOrBehavior.traitComposition = traitComposition && traitComposition.length ? traitComposition : null;
-                (traitOrBehavior.traitComposition || []).forEach(function (each) {
-                    addElement(each.trait.traitUsers, traitOrBehavior);
-                });
-            };
-
-            function aliasesOfSelector (selector, traitAliases) {
-                if (!traitAliases) return [selector];
-                var result = Object.keys(traitAliases).filter(function (aliasSelector) {
-                    return traitAliases[aliasSelector] === selector
-                });
-                if (!traitAliases[selector]) result.push(selector);
-                return result;
-            }
-
-            function applyTraitMethodAddition (selector, method, traitTransformation, obj) {
-                var changes = aliasesOfSelector(selector, traitTransformation.aliases);
-                changes.forEach(function (aliasSelector) {
-                    obj[aliasSelector] = aliased(aliasSelector, method);
-                });
-                var traitExclusions = traitTransformation.exclusions;
-                if (traitExclusions) {
-                    deleteKeysFrom(traitExclusions, obj);
-                }
-                return changes;
-            }
-
-            function applyTraitMethodDeletion (selector, traitTransformation, obj) {
-                var changes = aliasesOfSelector(selector, traitTransformation.aliases);
-                deleteKeysFrom(changes, obj);
-                return changes;
-            }
-
-            function traitMethodChanged (selector, method, trait, traitOrBehavior) {
-                var traitComposition = traitOrBehavior.traitComposition,
-                    chain = traitOrBehavior.localMethods,
-                    changes = [];
-                for (var i = traitComposition.length - 1; i >= 0; --i) {
-                    chain = Object.getPrototypeOf(chain);
-                    var traitTransformation = traitComposition[i];
-                    if (traitTransformation.trait !== trait) continue;
-                    changes.push.apply(changes, method ?
-                        applyTraitMethodAddition(selector, method, traitTransformation, chain) :
-                        applyTraitMethodDeletion(selector, traitTransformation, chain));
-                }
-                // assert(chain === null);
-                changes.forEach(function (each) {
-                    updateMethod(each, traitOrBehavior);
-                });
-            }
-
-            this.traitMethodChanged = traitMethodChanged;
-        }
-
         ClassesBrik.deps = ["root", "event", "behaviors", "methods", "arraySet", "nil"];
 
         function ClassesBrik (brikz, st) {

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

@@ -17,6 +17,77 @@ define(function () {
         });
     }
 
+    function SelectorConversionBrik (brikz, st) {
+        var st2jsMemo = Object.create(null);
+
+        /* Convert a Smalltalk selector into a JS selector */
+        function st2js (string) {
+            return '_' + string
+                .replace(/:/g, '_')
+                .replace(/[\&]/g, '_and')
+                .replace(/[\|]/g, '_or')
+                .replace(/[+]/g, '_plus')
+                .replace(/-/g, '_minus')
+                .replace(/[*]/g, '_star')
+                .replace(/[\/]/g, '_slash')
+                .replace(/[\\]/g, '_backslash')
+                .replace(/[\~]/g, '_tild')
+                .replace(/%/g, '_percent')
+                .replace(/>/g, '_gt')
+                .replace(/</g, '_lt')
+                .replace(/=/g, '_eq')
+                .replace(/,/g, '_comma')
+                .replace(/[@]/g, '_at');
+        };
+
+        st.st2js = function (stSelector) {
+            return st2jsMemo[stSelector] || st2js(stSelector);
+        };
+
+        this.st2js = function (stSelector) {
+            return st2jsMemo[stSelector] || (st2jsMemo[stSelector] = st2js(stSelector));
+        };
+
+        /* Convert a string to a valid smalltalk selector.
+         if you modify the following functions, also change st2js
+         accordingly */
+        st.js2st = function (selector) {
+            if (selector.match(/^__/)) {
+                return binaryJsToSt(selector);
+            } else {
+                return keywordJsToSt(selector);
+            }
+        };
+
+        function keywordJsToSt (selector) {
+            return selector.replace(/^_/, '').replace(/_/g, ':');
+        }
+
+        function binaryJsToSt (selector) {
+            return selector
+                .replace(/^_/, '')
+                .replace(/_and/g, '&')
+                .replace(/_or/g, '|')
+                .replace(/_plus/g, '+')
+                .replace(/_minus/g, '-')
+                .replace(/_star/g, '*')
+                .replace(/_slash/g, '/')
+                .replace(/_backslash/g, '\\')
+                .replace(/_tild/g, '~')
+                .replace(/_percent/g, '%')
+                .replace(/_gt/g, '>')
+                .replace(/_lt/g, '<')
+                .replace(/_eq/g, '=')
+                .replace(/_comma/g, ',')
+                .replace(/_at/g, '@');
+        }
+
+        st.st2prop = function (stSelector) {
+            var colonPosition = stSelector.indexOf(':');
+            return colonPosition === -1 ? stSelector : stSelector.slice(0, colonPosition);
+        };
+    }
+
     function RuntimeFactory (globals, emit) {
         RuntimeSelectorsBrik.deps = ["selectors", "selectorConversion", "classes"];
 
@@ -395,77 +466,6 @@ define(function () {
             };
         }
 
-        function SelectorConversionBrik (brikz, st) {
-            var st2jsMemo = Object.create(null);
-
-            /* Convert a Smalltalk selector into a JS selector */
-            function st2js (string) {
-                return '_' + string
-                    .replace(/:/g, '_')
-                    .replace(/[\&]/g, '_and')
-                    .replace(/[\|]/g, '_or')
-                    .replace(/[+]/g, '_plus')
-                    .replace(/-/g, '_minus')
-                    .replace(/[*]/g, '_star')
-                    .replace(/[\/]/g, '_slash')
-                    .replace(/[\\]/g, '_backslash')
-                    .replace(/[\~]/g, '_tild')
-                    .replace(/%/g, '_percent')
-                    .replace(/>/g, '_gt')
-                    .replace(/</g, '_lt')
-                    .replace(/=/g, '_eq')
-                    .replace(/,/g, '_comma')
-                    .replace(/[@]/g, '_at');
-            };
-
-            st.st2js = function (stSelector) {
-                return st2jsMemo[stSelector] || st2js(stSelector);
-            };
-
-            this.st2js = function (stSelector) {
-                return st2jsMemo[stSelector] || (st2jsMemo[stSelector] = st2js(stSelector));
-            };
-
-            /* Convert a string to a valid smalltalk selector.
-             if you modify the following functions, also change st2js
-             accordingly */
-            st.js2st = function (selector) {
-                if (selector.match(/^__/)) {
-                    return binaryJsToSt(selector);
-                } else {
-                    return keywordJsToSt(selector);
-                }
-            };
-
-            function keywordJsToSt (selector) {
-                return selector.replace(/^_/, '').replace(/_/g, ':');
-            }
-
-            function binaryJsToSt (selector) {
-                return selector
-                    .replace(/^_/, '')
-                    .replace(/_and/g, '&')
-                    .replace(/_or/g, '|')
-                    .replace(/_plus/g, '+')
-                    .replace(/_minus/g, '-')
-                    .replace(/_star/g, '*')
-                    .replace(/_slash/g, '/')
-                    .replace(/_backslash/g, '\\')
-                    .replace(/_tild/g, '~')
-                    .replace(/_percent/g, '%')
-                    .replace(/_gt/g, '>')
-                    .replace(/_lt/g, '<')
-                    .replace(/_eq/g, '=')
-                    .replace(/_comma/g, ',')
-                    .replace(/_at/g, '@');
-            }
-
-            st.st2prop = function (stSelector) {
-                var colonPosition = stSelector.indexOf(':');
-                return colonPosition === -1 ? stSelector : stSelector.slice(0, colonPosition);
-            };
-        }
-
         StartImageBrik.deps = ["runtimeClasses", "runtimeMethods"];
 
         function StartImageBrik (brikz, st) {