| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499 | 
							- /* ====================================================================
 
-  |
 
-  |   Amber Smalltalk
 
-  |   http://amber-lang.net
 
-  |
 
-  ======================================================================
 
-  ======================================================================
 
-  |
 
-  | Copyright (c) 2010-2014
 
-  | Nicolas Petton <petton.nicolas@gmail.com>
 
-  |
 
-  | Copyright (c) 2012-2016
 
-  | The Amber team https://lolg.it/org/amber/members
 
-  | Amber contributors (see /CONTRIBUTORS)
 
-  |
 
-  | Amber is released under the MIT license
 
-  |
 
-  | Permission is hereby granted, free of charge, to any person obtaining
 
-  | a copy of this software and associated documentation files (the
 
-  | 'Software'), to deal in the Software without restriction, including
 
-  | without limitation the rights to use, copy, modify, merge, publish,
 
-  | distribute, sublicense, and/or sell copies of the Software, and to
 
-  | permit persons to whom the Software is furnished to do so, subject to
 
-  | the following conditions:
 
-  |
 
-  | The above copyright notice and this permission notice shall be
 
-  | included in all copies or substantial portions of the Software.
 
-  |
 
-  | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
 
-  | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
-  | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 
-  | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 
-  | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 
-  | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 
-  | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-  |
 
-  ==================================================================== */
 
- //jshint eqnull:true
 
- define(['./compatibility'], function () {
 
-     "use strict";
 
-     function inherits (child, parent) {
 
-         child.prototype = Object.create(parent.prototype, {
 
-             constructor: {
 
-                 value: child,
 
-                 enumerable: false, configurable: true, writable: true
 
-             }
 
-         });
 
-         return child;
 
-     }
 
-     function SmalltalkGlobalsBrik (brikz, st) {
 
-         // jshint evil:true
 
-         var jsGlobals = new Function("return this")();
 
-         var globals = Object.create(jsGlobals);
 
-         globals.SmalltalkSettings = {};
 
-         this.globals = globals;
 
-     }
 
-     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)
 
-          do not directly inherit from SmalltalkRoot, but employ a workaround.*/
 
-         function SmalltalkRoot () {
 
-         }
 
-         function SmalltalkProtoObject () {
 
-         }
 
-         function SmalltalkObject () {
 
-         }
 
-         coreFns.ProtoObject = inherits(SmalltalkProtoObject, SmalltalkRoot);
 
-         coreFns.Object = inherits(SmalltalkObject, SmalltalkProtoObject);
 
-         this.Root = SmalltalkRoot;
 
-         this.Object = SmalltalkObject;
 
-     }
 
-     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;
 
-         function SmalltalkOrganizer () {
 
-         }
 
-         function SmalltalkPackageOrganizer () {
 
-             this.elements = [];
 
-         }
 
-         function SmalltalkClassOrganizer () {
 
-             this.elements = [];
 
-         }
 
-         coreFns.Organizer = inherits(SmalltalkOrganizer, SmalltalkObject);
 
-         coreFns.PackageOrganizer = inherits(SmalltalkPackageOrganizer, SmalltalkOrganizer);
 
-         coreFns.ClassOrganizer = inherits(SmalltalkClassOrganizer, SmalltalkOrganizer);
 
-         this.setupClassOrganization = function (behaviorBody) {
 
-             behaviorBody.organization = new SmalltalkClassOrganizer();
 
-             behaviorBody.organization.theClass = behaviorBody;
 
-         };
 
-         this.setupPackageOrganization = function (pkg) {
 
-             pkg.organization = new SmalltalkPackageOrganizer();
 
-         };
 
-         this.addOrganizationElement = function (owner, element) {
 
-             addElement(owner.organization.elements, element);
 
-         };
 
-         this.removeOrganizationElement = function (owner, element) {
 
-             removeElement(owner.organization.elements, element);
 
-         };
 
-     }
 
-     SelectorsBrik.deps = ["selectorConversion"];
 
-     function SelectorsBrik (brikz, st) {
 
-         var selectorSet = Object.create(null);
 
-         var selectors = this.selectors = [];
 
-         var selectorPairs = this.selectorPairs = [];
 
-         this.registerSelector = function (stSelector) {
 
-             if (selectorSet[stSelector]) return null;
 
-             var jsSelector = st.st2js(stSelector);
 
-             selectorSet[stSelector] = true;
 
-             selectors.push(stSelector);
 
-             var pair = {st: stSelector, js: jsSelector};
 
-             selectorPairs.push(pair);
 
-             return pair;
 
-         };
 
-         st.allSelectors = function () {
 
-             return selectors;
 
-         };
 
-     }
 
-     PackagesBrik.deps = ["organize", "root"];
 
-     function PackagesBrik (brikz, st) {
 
-         var setupPackageOrganization = brikz.organize.setupPackageOrganization;
 
-         var SmalltalkObject = brikz.root.Object;
 
-         var coreFns = brikz.root.coreFns;
 
-         function SmalltalkPackage () {
 
-         }
 
-         coreFns.Package = inherits(SmalltalkPackage, SmalltalkObject);
 
-         st.packages = {};
 
-         /* Smalltalk package creation. To add a Package, use smalltalk.addPackage() */
 
-         function pkg (spec) {
 
-             var that = new SmalltalkPackage();
 
-             that.pkgName = spec.pkgName;
 
-             setupPackageOrganization(that);
 
-             that.properties = spec.properties || {};
 
-             return that;
 
-         }
 
-         /* Add a package to the system, creating a new one if needed.
 
-          If pkgName is null or empty we return nil.
 
-          If package already exists we still update the properties of it. */
 
-         st.addPackage = function (pkgName, properties) {
 
-             if (!pkgName) return null;
 
-             if (!st.packages[pkgName]) {
 
-                 st.packages[pkgName] = pkg({
 
-                     pkgName: pkgName,
 
-                     properties: properties
 
-                 });
 
-             } else {
 
-                 if (properties) {
 
-                     st.packages[pkgName].properties = properties;
 
-                 }
 
-             }
 
-             return st.packages[pkgName];
 
-         };
 
-     }
 
-     BehaviorsBrik.deps = ["organize", "root", "smalltalkGlobals", "arraySet"];
 
-     function BehaviorsBrik (brikz, st) {
 
-         var addOrganizationElement = brikz.organize.addOrganizationElement;
 
-         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 () {
 
-         }
 
-         coreFns.BehaviorBody = inherits(SmalltalkBehaviorBody, SmalltalkObject);
 
-         this.BehaviorBody = SmalltalkBehaviorBody;
 
-         /* Smalltalk classes */
 
-         var classes = [];
 
-         this.buildBehaviorBody = function (pkgName, builder) {
 
-             var pkg = st.packages[pkgName];
 
-             if (!pkg) throw new Error("Missing package " + pkgName);
 
-             var behaviorBody = globals.hasOwnProperty(builder.className) && globals[builder.className];
 
-             if (behaviorBody) {
 
-                 builder.updateExisting(behaviorBody, pkg);
 
-             } else {
 
-                 behaviorBody = builder.make(pkg);
 
-             }
 
-             addBehaviorBody(behaviorBody);
 
-             return behaviorBody;
 
-         };
 
-         function addBehaviorBody (behaviorBody) {
 
-             globals[behaviorBody.className] = behaviorBody;
 
-             addElement(classes, behaviorBody);
 
-             addOrganizationElement(behaviorBody.pkg, behaviorBody);
 
-             behaviorBody.added();
 
-         }
 
-         function removeBehaviorBody (behaviorBody) {
 
-             behaviorBody.removed();
 
-             removeOrganizationElement(behaviorBody.pkg, behaviorBody);
 
-             removeElement(classes, behaviorBody);
 
-             delete globals[behaviorBody.className];
 
-         }
 
-         this.removeBehaviorBody = removeBehaviorBody;
 
-         /* Create an alias for an existing class */
 
-         st.alias = function (behaviorBody, alias) {
 
-             globals[alias] = behaviorBody;
 
-         };
 
-         /* Answer all registered Smalltalk classes */
 
-         //TODO: remove the function and make smalltalk.classes an array
 
-         st.classes = this.classes = function () {
 
-             return classes;
 
-         };
 
-     }
 
-     MethodsBrik.deps = ["composition", "selectors", "root", "selectorConversion"];
 
-     function MethodsBrik (brikz, st) {
 
-         var registerSelector = brikz.selectors.registerSelector;
 
-         var updateMethod = brikz.composition.updateMethod;
 
-         var SmalltalkObject = brikz.root.Object;
 
-         var coreFns = brikz.root.coreFns;
 
-         function SmalltalkMethod () {
 
-         }
 
-         coreFns.CompiledMethod = inherits(SmalltalkMethod, SmalltalkObject);
 
-         /* Smalltalk method object. To add a method to a class,
 
-          use api.addMethod() */
 
-         st.method = function (spec) {
 
-             var that = new SmalltalkMethod();
 
-             var selector = spec.selector;
 
-             that.selector = selector;
 
-             that.jsSelector = st.st2js(selector);
 
-             that.args = spec.args || {};
 
-             that.protocol = spec.protocol;
 
-             that.source = spec.source;
 
-             that.messageSends = spec.messageSends || [];
 
-             that.referencedClasses = spec.referencedClasses || [];
 
-             that.fn = spec.fn;
 
-             return that;
 
-         };
 
-         /* Add/remove a method to/from a class */
 
-         st.addMethod = function (method, behaviorBody) {
 
-             if (method.methodClass != null) {
 
-                 throw new Error("addMethod: Method " + method.selector + " already bound to " + method.methodClass);
 
-             }
 
-             method.methodClass = behaviorBody;
 
-             registerNewSelectors(method);
 
-             behaviorBody.localMethods[method.selector] = method;
 
-             updateMethod(method.selector, behaviorBody);
 
-         };
 
-         function registerNewSelectors (method) {
 
-             var newSelectors = [];
 
-             function selectorInUse (stSelector) {
 
-                 var pair = registerSelector(stSelector);
 
-                 if (pair) {
 
-                     newSelectors.push(pair);
 
-                 }
 
-             }
 
-             selectorInUse(method.selector);
 
-             method.messageSends.forEach(selectorInUse);
 
-             if (st._selectorsAdded) st._selectorsAdded(newSelectors);
 
-         }
 
-         st.removeMethod = function (method, behaviorBody) {
 
-             if (behaviorBody.localMethods[method.selector] !== method) return;
 
-             delete behaviorBody.localMethods[method.selector];
 
-             updateMethod(method.selector, behaviorBody);
 
-         };
 
-     }
 
-     MethodCompositionBrik.deps = ["organize"];
 
-     function MethodCompositionBrik (brikz, st) {
 
-         var setupClassOrganization = brikz.organize.setupClassOrganization;
 
-         var addOrganizationElement = brikz.organize.addOrganizationElement;
 
-         this.setupMethods = function (behaviorBody) {
 
-             setupClassOrganization(behaviorBody);
 
-             behaviorBody.traitComposition = [];
 
-             behaviorBody.localMethods = Object.create(null);
 
-             behaviorBody.methods = Object.create(null);
 
-         };
 
-         function addMethod (method, behaviorBody) {
 
-             behaviorBody.methods[method.selector] = method;
 
-             // During the bootstrap, #addCompiledMethod is not used.
 
-             // Therefore we populate the organizer here too
 
-             addOrganizationElement(behaviorBody, method.protocol);
 
-             behaviorBody.methodAdded(method);
 
-         }
 
-         function removeMethod (method, behaviorBody) {
 
-             delete behaviorBody.methods[method.selector];
 
-             behaviorBody.methodRemoved(method);
 
-             // Do *not* delete protocols from here.
 
-             // This is handled by #removeCompiledMethod
 
-         }
 
-         function applyTraitTransformation(traitTransformation, obj) {
 
-             // TODO not implemented yet, noop atm
 
-             return obj;
 
-         }
 
-         function buildCompositionChain (traitComposition) {
 
-             return traitComposition.reduce(function (soFar, each) {
 
-                 return applyTraitTransformation(each, Object.create(soFar));
 
-             }, null);
 
-         }
 
-         st.setTraitComposition = function (traitComposition, behaviorBody) {
 
-             var oldLocalMethods = behaviorBody.localMethods,
 
-                 newLocalMethods = Object.create(buildCompositionChain(traitComposition));
 
-             Object.keys(oldLocalMethods).forEach(function (selector) {
 
-                 newLocalMethods[selector] = oldLocalMethods[selector];
 
-             });
 
-             behaviorBody.localMethods = newLocalMethods;
 
-             for (var selector in newLocalMethods) {
 
-                 updateMethod(selector, behaviorBody);
 
-             }
 
-             for (var selector in oldLocalMethods) {
 
-                 updateMethod(selector, behaviorBody);
 
-             }
 
-             behaviorBody.traitComposition.forEach(function (each) {
 
-                 each.trait.removeUser(behaviorBody);
 
-             });
 
-             behaviorBody.traitComposition = traitComposition;
 
-             behaviorBody.traitComposition.forEach(function (each) {
 
-                 each.trait.addUser(behaviorBody);
 
-             });
 
-         };
 
-         function updateMethod (selector, behaviorBody) {
 
-             var oldMethod = behaviorBody.methods[selector],
 
-                 newMethod = behaviorBody.localMethods[selector];
 
-             if (oldMethod == null && newMethod == null) {
 
-                 console.warn("Removal of nonexistent method " + behaviorBody + " >> " + selector);
 
-                 return;
 
-             }
 
-             if (newMethod === oldMethod) return;
 
-             if (newMethod != null) addMethod(newMethod, behaviorBody);
 
-             else removeMethod(oldMethod, behaviorBody);
 
-         }
 
-         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);
 
-             }
 
-         };
 
-     }
 
-     function SelectorConversionBrik (brikz, st) {
 
-         /* Convert a Smalltalk selector into a JS selector */
 
-         st.st2js = function (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');
 
-         };
 
-         /* 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);
 
-         };
 
-     }
 
-     /* Making smalltalk that has basic building blocks */
 
-     function configureWithFundamentals (brikz) {
 
-         brikz.smalltalkGlobals = SmalltalkGlobalsBrik;
 
-         brikz.root = RootBrik;
 
-         brikz.arraySet = ArraySetBrik;
 
-         brikz.organize = OrganizeBrik;
 
-         brikz.selectorConversion = SelectorConversionBrik;
 
-         brikz.selectors = SelectorsBrik;
 
-         brikz.packages = PackagesBrik;
 
-         brikz.composition = MethodCompositionBrik;
 
-         brikz.behaviors = BehaviorsBrik;
 
-         brikz.methods = MethodsBrik;
 
-         brikz.rebuild();
 
-     }
 
-     return configureWithFundamentals;
 
- });
 
 
  |