diff options
Diffstat (limited to 'addon-sdk/source/lib/sdk/lang')
-rw-r--r-- | addon-sdk/source/lib/sdk/lang/functional.js | 47 | ||||
-rw-r--r-- | addon-sdk/source/lib/sdk/lang/functional/concurrent.js | 110 | ||||
-rw-r--r-- | addon-sdk/source/lib/sdk/lang/functional/core.js | 290 | ||||
-rw-r--r-- | addon-sdk/source/lib/sdk/lang/functional/helpers.js | 29 | ||||
-rw-r--r-- | addon-sdk/source/lib/sdk/lang/type.js | 388 | ||||
-rw-r--r-- | addon-sdk/source/lib/sdk/lang/weak-set.js | 75 |
6 files changed, 0 insertions, 939 deletions
diff --git a/addon-sdk/source/lib/sdk/lang/functional.js b/addon-sdk/source/lib/sdk/lang/functional.js deleted file mode 100644 index 66e30edfa..000000000 --- a/addon-sdk/source/lib/sdk/lang/functional.js +++ /dev/null @@ -1,47 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Disclaimer: Some of the functions in this module implement APIs from -// Jeremy Ashkenas's http://underscorejs.org/ library and all credits for -// those goes to him. - -"use strict"; - -module.metadata = { - "stability": "unstable" -}; - -const { defer, remit, delay, debounce, - throttle } = require("./functional/concurrent"); -const { method, invoke, partial, curry, compose, wrap, identity, memoize, once, - cache, complement, constant, when, apply, flip, field, query, - isInstance, chainable, is, isnt } = require("./functional/core"); - -exports.defer = defer; -exports.remit = remit; -exports.delay = delay; -exports.debounce = debounce; -exports.throttle = throttle; - -exports.method = method; -exports.invoke = invoke; -exports.partial = partial; -exports.curry = curry; -exports.compose = compose; -exports.wrap = wrap; -exports.identity = identity; -exports.memoize = memoize; -exports.once = once; -exports.cache = cache; -exports.complement = complement; -exports.constant = constant; -exports.when = when; -exports.apply = apply; -exports.flip = flip; -exports.field = field; -exports.query = query; -exports.isInstance = isInstance; -exports.chainable = chainable; -exports.is = is; -exports.isnt = isnt; diff --git a/addon-sdk/source/lib/sdk/lang/functional/concurrent.js b/addon-sdk/source/lib/sdk/lang/functional/concurrent.js deleted file mode 100644 index 85e8cff46..000000000 --- a/addon-sdk/source/lib/sdk/lang/functional/concurrent.js +++ /dev/null @@ -1,110 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Disclaimer: Some of the functions in this module implement APIs from -// Jeremy Ashkenas's http://underscorejs.org/ library and all credits for -// those goes to him. - -"use strict"; - -module.metadata = { - "stability": "unstable" -}; - -const { arity, name, derive, invoke } = require("./helpers"); -const { setTimeout, clearTimeout, setImmediate } = require("../../timers"); - -/** - * Takes a function and returns a wrapped one instead, calling which will call - * original function in the next turn of event loop. This is basically utility - * to do `setImmediate(function() { ... })`, with a difference that returned - * function is reused, instead of creating a new one each time. This also allows - * to use this functions as event listeners. - */ -const defer = f => derive(function(...args) { - setImmediate(invoke, f, args, this); -}, f); -exports.defer = defer; -// Exporting `remit` alias as `defer` may conflict with promises. -exports.remit = defer; - -/** - * Much like setTimeout, invokes function after wait milliseconds. If you pass - * the optional arguments, they will be forwarded on to the function when it is - * invoked. - */ -const delay = function delay(f, ms, ...args) { - setTimeout(() => f.apply(this, args), ms); -}; -exports.delay = delay; - -/** - * From underscore's `_.debounce` - * http://underscorejs.org - * (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Underscore may be freely distributed under the MIT license. - */ -const debounce = function debounce (fn, wait) { - let timeout, args, context, timestamp, result; - - let later = function () { - let last = Date.now() - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - result = fn.apply(context, args); - context = args = null; - } - }; - - return function (...aArgs) { - context = this; - args = aArgs; - timestamp = Date.now(); - if (!timeout) { - timeout = setTimeout(later, wait); - } - - return result; - }; -}; -exports.debounce = debounce; - -/** - * From underscore's `_.throttle` - * http://underscorejs.org - * (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Underscore may be freely distributed under the MIT license. - */ -const throttle = function throttle (func, wait, options) { - let context, args, result; - let timeout = null; - let previous = 0; - options || (options = {}); - let later = function() { - previous = options.leading === false ? 0 : Date.now(); - timeout = null; - result = func.apply(context, args); - context = args = null; - }; - return function() { - let now = Date.now(); - if (!previous && options.leading === false) previous = now; - let remaining = wait - (now - previous); - context = this; - args = arguments; - if (remaining <= 0) { - clearTimeout(timeout); - timeout = null; - previous = now; - result = func.apply(context, args); - context = args = null; - } else if (!timeout && options.trailing !== false) { - timeout = setTimeout(later, remaining); - } - return result; - }; -}; -exports.throttle = throttle; diff --git a/addon-sdk/source/lib/sdk/lang/functional/core.js b/addon-sdk/source/lib/sdk/lang/functional/core.js deleted file mode 100644 index 0d9143364..000000000 --- a/addon-sdk/source/lib/sdk/lang/functional/core.js +++ /dev/null @@ -1,290 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Disclaimer: Some of the functions in this module implement APIs from -// Jeremy Ashkenas's http://underscorejs.org/ library and all credits for -// those goes to him. - -"use strict"; - -module.metadata = { - "stability": "unstable" -} -const { arity, name, derive, invoke } = require("./helpers"); - -/** - * Takes variadic numeber of functions and returns composed one. - * Returned function pushes `this` pseudo-variable to the head - * of the passed arguments and invokes all the functions from - * left to right passing same arguments to them. Composite function - * returns return value of the right most funciton. - */ -const method = (...lambdas) => { - return function method(...args) { - args.unshift(this); - return lambdas.reduce((_, lambda) => lambda.apply(this, args), - void(0)); - }; -}; -exports.method = method; - -/** - * Invokes `callee` by passing `params` as an arguments and `self` as `this` - * pseudo-variable. Returns value that is returned by a callee. - * @param {Function} callee - * Function to invoke. - * @param {Array} params - * Arguments to invoke function with. - * @param {Object} self - * Object to be passed as a `this` pseudo variable. - */ -exports.invoke = invoke; - -/** - * Takes a function and bind values to one or more arguments, returning a new - * function of smaller arity. - * - * @param {Function} fn - * The function to partial - * - * @returns The new function with binded values - */ -const partial = (f, ...curried) => { - if (typeof(f) !== "function") - throw new TypeError(String(f) + " is not a function"); - - let fn = derive(function(...args) { - return f.apply(this, curried.concat(args)); - }, f); - fn.arity = arity(f) - curried.length; - return fn; -}; -exports.partial = partial; - -/** - * Returns function with implicit currying, which will continue currying until - * expected number of argument is collected. Expected number of arguments is - * determined by `fn.length`. Using this with variadic functions is stupid, - * so don't do it. - * - * @examples - * - * var sum = curry(function(a, b) { - * return a + b - * }) - * console.log(sum(2, 2)) // 4 - * console.log(sum(2)(4)) // 6 - */ -const curry = new function() { - const currier = (fn, arity, params) => { - // Function either continues to curry arguments or executes function - // if desired arguments have being collected. - const curried = function(...input) { - // Prepend all curried arguments to the given arguments. - if (params) input.unshift.apply(input, params); - // If expected number of arguments has being collected invoke fn, - // othrewise return curried version Otherwise continue curried. - return (input.length >= arity) ? fn.apply(this, input) : - currier(fn, arity, input); - }; - curried.arity = arity - (params ? params.length : 0); - - return curried; - }; - - return fn => currier(fn, arity(fn)); -}; -exports.curry = curry; - -/** - * Returns the composition of a list of functions, where each function consumes - * the return value of the function that follows. In math terms, composing the - * functions `f()`, `g()`, and `h()` produces `f(g(h()))`. - * @example - * - * var greet = function(name) { return "hi: " + name; }; - * var exclaim = function(statement) { return statement + "!"; }; - * var welcome = compose(exclaim, greet); - * - * welcome('moe'); // => 'hi: moe!' - */ -function compose(...lambdas) { - return function composed(...args) { - let index = lambdas.length; - while (0 <= --index) - args = [lambdas[index].apply(this, args)]; - - return args[0]; - }; -} -exports.compose = compose; - -/* - * Returns the first function passed as an argument to the second, - * allowing you to adjust arguments, run code before and after, and - * conditionally execute the original function. - * @example - * - * var hello = function(name) { return "hello: " + name; }; - * hello = wrap(hello, function(f) { - * return "before, " + f("moe") + ", after"; - * }); - * - * hello(); // => 'before, hello: moe, after' - */ -const wrap = (f, wrapper) => derive(function wrapped(...args) { - return wrapper.apply(this, [f].concat(args)); -}, f); -exports.wrap = wrap; - -/** - * Returns the same value that is used as the argument. In math: f(x) = x - */ -const identity = value => value; -exports.identity = identity; - -/** - * Memoizes a given function by caching the computed result. Useful for - * speeding up slow-running computations. If passed an optional hashFunction, - * it will be used to compute the hash key for storing the result, based on - * the arguments to the original function. The default hashFunction just uses - * the first argument to the memoized function as the key. - */ -const memoize = (f, hasher) => { - let memo = Object.create(null); - let cache = new WeakMap(); - hasher = hasher || identity; - return derive(function memoizer(...args) { - const key = hasher.apply(this, args); - const type = typeof(key); - if (key && (type === "object" || type === "function")) { - if (!cache.has(key)) - cache.set(key, f.apply(this, args)); - return cache.get(key); - } - else { - if (!(key in memo)) - memo[key] = f.apply(this, args); - return memo[key]; - } - }, f); -}; -exports.memoize = memoize; - -/* - * Creates a version of the function that can only be called one time. Repeated - * calls to the modified function will have no effect, returning the value from - * the original call. Useful for initialization functions, instead of having to - * set a boolean flag and then check it later. - */ -const once = f => { - let ran = false, cache; - return derive(function(...args) { - return ran ? cache : (ran = true, cache = f.apply(this, args)); - }, f); -}; -exports.once = once; -// export cache as once will may be conflicting with event once a lot. -exports.cache = once; - -// Takes a `f` function and returns a function that takes the same -// arguments as `f`, has the same effects, if any, and returns the -// opposite truth value. -const complement = f => derive(function(...args) { - return args.length < arity(f) ? complement(partial(f, ...args)) : - !f.apply(this, args); -}, f); -exports.complement = complement; - -// Constructs function that returns `x` no matter what is it -// invoked with. -const constant = x => _ => x; -exports.constant = constant; - -// Takes `p` predicate, `consequent` function and an optional -// `alternate` function and composes function that returns -// application of arguments over `consequent` if application over -// `p` is `true` otherwise returns application over `alternate`. -// If `alternate` is not a function returns `undefined`. -const when = (p, consequent, alternate) => { - if (typeof(alternate) !== "function" && alternate !== void(0)) - throw TypeError("alternate must be a function"); - if (typeof(consequent) !== "function") - throw TypeError("consequent must be a function"); - - return function(...args) { - return p.apply(this, args) ? - consequent.apply(this, args) : - alternate && alternate.apply(this, args); - }; -}; -exports.when = when; - -// Apply function that behaves as `apply` does in lisp: -// apply(f, x, [y, z]) => f.apply(f, [x, y, z]) -// apply(f, x) => f.apply(f, [x]) -const apply = (f, ...rest) => f.apply(f, rest.concat(rest.pop())); -exports.apply = apply; - -// Returns function identical to given `f` but with flipped order -// of arguments. -const flip = f => derive(function(...args) { - return f.apply(this, args.reverse()); -}, f); -exports.flip = flip; - -// Takes field `name` and `target` and returns value of that field. -// If `target` is `null` or `undefined` it would be returned back -// instead of attempt to access it's field. Function is implicitly -// curried, this allows accessor function generation by calling it -// with only `name` argument. -const field = curry((name, target) => - // Note: Permisive `==` is intentional. - target == null ? target : target[name]); -exports.field = field; - -// Takes `.` delimited string representing `path` to a nested field -// and a `target` to get it from. For convinience function is -// implicitly curried, there for accessors can be created by invoking -// it with just a `path` argument. -const query = curry((path, target) => { - const names = path.split("."); - const count = names.length; - let index = 0; - let result = target; - // Note: Permisive `!=` is intentional. - while (result != null && index < count) { - result = result[names[index]]; - index = index + 1; - } - return result; -}); -exports.query = query; - -// Takes `Type` (constructor function) and a `value` and returns -// `true` if `value` is instance of the given `Type`. Function is -// implicitly curried this allows predicate generation by calling -// function with just first argument. -const isInstance = curry((Type, value) => value instanceof Type); -exports.isInstance = isInstance; - -/* - * Takes a funtion and returns a wrapped function that returns `this` - */ -const chainable = f => derive(function(...args) { - f.apply(this, args); - return this; -}, f); -exports.chainable = chainable; - -// Functions takes `expected` and `actual` values and returns `true` if -// `expected === actual`. Returns curried function if called with less then -// two arguments. -// -// [ 1, 0, 1, 0, 1 ].map(is(1)) // => [ true, false, true, false, true ] -const is = curry((expected, actual) => actual === expected); -exports.is = is; - -const isnt = complement(is); -exports.isnt = isnt; diff --git a/addon-sdk/source/lib/sdk/lang/functional/helpers.js b/addon-sdk/source/lib/sdk/lang/functional/helpers.js deleted file mode 100644 index 60f4e3300..000000000 --- a/addon-sdk/source/lib/sdk/lang/functional/helpers.js +++ /dev/null @@ -1,29 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Disclaimer: Some of the functions in this module implement APIs from -// Jeremy Ashkenas's http://underscorejs.org/ library and all credits for -// those goes to him. - -"use strict"; - -module.metadata = { - "stability": "unstable" -} - -const arity = f => f.arity || f.length; -exports.arity = arity; - -const name = f => f.displayName || f.name; -exports.name = name; - -const derive = (f, source) => { - f.displayName = name(source); - f.arity = arity(source); - return f; -}; -exports.derive = derive; - -const invoke = (callee, params, self) => callee.apply(self, params); -exports.invoke = invoke; diff --git a/addon-sdk/source/lib/sdk/lang/type.js b/addon-sdk/source/lib/sdk/lang/type.js deleted file mode 100644 index b50e6be4c..000000000 --- a/addon-sdk/source/lib/sdk/lang/type.js +++ /dev/null @@ -1,388 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -module.metadata = { - "stability": "unstable" -}; - -/** - * Returns `true` if `value` is `undefined`. - * @examples - * var foo; isUndefined(foo); // true - * isUndefined(0); // false - */ -function isUndefined(value) { - return value === undefined; -} -exports.isUndefined = isUndefined; - -/** - * Returns `true` if value is `null`. - * @examples - * isNull(null); // true - * isNull(undefined); // false - */ -function isNull(value) { - return value === null; -} -exports.isNull = isNull; - -/** - * Returns `true` if value is `null` or `undefined`. - * It's equivalent to `== null`, but resolve the ambiguity of the writer - * intention, makes clear that he's clearly checking both `null` and `undefined` - * values, and it's not a typo for `=== null`. - */ -function isNil(value) { - return value === null || value === undefined; -} -exports.isNil = isNil; - -function isBoolean(value) { - return typeof value === "boolean"; -} -exports.isBoolean = isBoolean; -/** - * Returns `true` if value is a string. - * @examples - * isString("moe"); // true - */ -function isString(value) { - return typeof value === "string"; -} -exports.isString = isString; - -/** - * Returns `true` if `value` is a number. - * @examples - * isNumber(8.4 * 5); // true - */ -function isNumber(value) { - return typeof value === "number"; -} -exports.isNumber = isNumber; - -/** - * Returns `true` if `value` is a `RegExp`. - * @examples - * isRegExp(/moe/); // true - */ -function isRegExp(value) { - return isObject(value) && instanceOf(value, RegExp); -} -exports.isRegExp = isRegExp; - -/** - * Returns true if `value` is a `Date`. - * @examples - * isDate(new Date()); // true - */ -function isDate(value) { - return isObject(value) && instanceOf(value, Date); -} -exports.isDate = isDate; - -/** - * Returns true if object is a Function. - * @examples - * isFunction(function foo(){}) // true - */ -function isFunction(value) { - return typeof value === "function"; -} -exports.isFunction = isFunction; - -/** - * Returns `true` if `value` is an object (please note that `null` is considered - * to be an atom and not an object). - * @examples - * isObject({}) // true - * isObject(null) // false - */ -function isObject(value) { - return typeof value === "object" && value !== null; -} -exports.isObject = isObject; - -/** - * Detect whether a value is a generator. - * - * @param aValue - * The value to identify. - * @return A boolean indicating whether the value is a generator. - */ -function isGenerator(aValue) { - return !!(aValue && aValue.isGenerator && aValue.isGenerator()); -} -exports.isGenerator = isGenerator; - -/** - * Returns true if `value` is an Array. - * @examples - * isArray([1, 2, 3]) // true - * isArray({ 0: 'foo', length: 1 }) // false - */ -var isArray = Array.isArray; -exports.isArray = isArray; - -/** - * Returns `true` if `value` is an Arguments object. - * @examples - * (function(){ return isArguments(arguments); })(1, 2, 3); // true - * isArguments([1,2,3]); // false - */ -function isArguments(value) { - return Object.prototype.toString.call(value) === "[object Arguments]"; -} -exports.isArguments = isArguments; - -var isMap = value => Object.prototype.toString.call(value) === "[object Map]" -exports.isMap = isMap; - -var isSet = value => Object.prototype.toString.call(value) === "[object Set]" -exports.isSet = isSet; - -/** - * Returns true if it is a primitive `value`. (null, undefined, number, - * boolean, string) - * @examples - * isPrimitive(3) // true - * isPrimitive('foo') // true - * isPrimitive({ bar: 3 }) // false - */ -function isPrimitive(value) { - return !isFunction(value) && !isObject(value); -} -exports.isPrimitive = isPrimitive; - -/** - * Returns `true` if given `object` is flat (it is direct decedent of - * `Object.prototype` or `null`). - * @examples - * isFlat({}) // true - * isFlat(new Type()) // false - */ -function isFlat(object) { - return isObject(object) && (isNull(Object.getPrototypeOf(object)) || - isNull(Object.getPrototypeOf( - Object.getPrototypeOf(object)))); -} -exports.isFlat = isFlat; - -/** - * Returns `true` if object contains no values. - */ -function isEmpty(object) { - if (isObject(object)) { - for (var key in object) - return false; - return true; - } - return false; -} -exports.isEmpty = isEmpty; - -/** - * Returns `true` if `value` is an array / flat object containing only atomic - * values and other flat objects. - */ -function isJSON(value, visited) { - // Adding value to array of visited values. - (visited || (visited = [])).push(value); - // If `value` is an atom return `true` cause it's valid JSON. - return isPrimitive(value) || - // If `value` is an array of JSON values that has not been visited - // yet. - (isArray(value) && value.every(function(element) { - return isJSON(element, visited); - })) || - // If `value` is a plain object containing properties with a JSON - // values it's a valid JSON. - (isFlat(value) && Object.keys(value).every(function(key) { - var $ = Object.getOwnPropertyDescriptor(value, key); - // Check every proprety of a plain object to verify that - // it's neither getter nor setter, but a JSON value, that - // has not been visited yet. - return ((!isObject($.value) || !~visited.indexOf($.value)) && - !('get' in $) && !('set' in $) && - isJSON($.value, visited)); - })); -} -exports.isJSON = function (value) { - return isJSON(value); -}; - -/** - * Returns `true` if `value` is JSONable - */ -const isJSONable = (value) => { - try { - JSON.parse(JSON.stringify(value)); - } - catch (e) { - return false; - } - return true; -}; -exports.isJSONable = isJSONable; - -/** - * Returns if `value` is an instance of a given `Type`. This is exactly same as - * `value instanceof Type` with a difference that `Type` can be from a scope - * that has a different top level object. (Like in case where `Type` is a - * function from different iframe / jetpack module / sandbox). - */ -function instanceOf(value, Type) { - var isConstructorNameSame; - var isConstructorSourceSame; - - // If `instanceof` returned `true` we know result right away. - var isInstanceOf = value instanceof Type; - - // If `instanceof` returned `false` we do ducktype check since `Type` may be - // from a different sandbox. If a constructor of the `value` or a constructor - // of the value's prototype has same name and source we assume that it's an - // instance of the Type. - if (!isInstanceOf && value) { - isConstructorNameSame = value.constructor.name === Type.name; - isConstructorSourceSame = String(value.constructor) == String(Type); - isInstanceOf = (isConstructorNameSame && isConstructorSourceSame) || - instanceOf(Object.getPrototypeOf(value), Type); - } - return isInstanceOf; -} -exports.instanceOf = instanceOf; - -/** - * Function returns textual representation of a value passed to it. Function - * takes additional `indent` argument that is used for indentation. Also - * optional `limit` argument may be passed to limit amount of detail returned. - * @param {Object} value - * @param {String} [indent=" "] - * @param {Number} [limit] - */ -function source(value, indent, limit, offset, visited) { - var result; - var names; - var nestingIndex; - var isCompact = !isUndefined(limit); - - indent = indent || " "; - offset = (offset || ""); - result = ""; - visited = visited || []; - - if (isUndefined(value)) { - result += "undefined"; - } - else if (isNull(value)) { - result += "null"; - } - else if (isString(value)) { - result += '"' + value + '"'; - } - else if (isFunction(value)) { - value = String(value).split("\n"); - if (isCompact && value.length > 2) { - value = value.splice(0, 2); - value.push("...}"); - } - result += value.join("\n" + offset); - } - else if (isArray(value)) { - if ((nestingIndex = (visited.indexOf(value) + 1))) { - result = "#" + nestingIndex + "#"; - } - else { - visited.push(value); - - if (isCompact) - value = value.slice(0, limit); - - result += "[\n"; - result += value.map(function(value) { - return offset + indent + source(value, indent, limit, offset + indent, - visited); - }).join(",\n"); - result += isCompact && value.length > limit ? - ",\n" + offset + "...]" : "\n" + offset + "]"; - } - } - else if (isObject(value)) { - if ((nestingIndex = (visited.indexOf(value) + 1))) { - result = "#" + nestingIndex + "#" - } - else { - visited.push(value) - - names = Object.keys(value); - - result += "{ // " + value + "\n"; - result += (isCompact ? names.slice(0, limit) : names).map(function(name) { - var _limit = isCompact ? limit - 1 : limit; - var descriptor = Object.getOwnPropertyDescriptor(value, name); - var result = offset + indent + "// "; - var accessor; - if (0 <= name.indexOf(" ")) - name = '"' + name + '"'; - - if (descriptor.writable) - result += "writable "; - if (descriptor.configurable) - result += "configurable "; - if (descriptor.enumerable) - result += "enumerable "; - - result += "\n"; - if ("value" in descriptor) { - result += offset + indent + name + ": "; - result += source(descriptor.value, indent, _limit, indent + offset, - visited); - } - else { - - if (descriptor.get) { - result += offset + indent + "get " + name + " "; - accessor = source(descriptor.get, indent, _limit, indent + offset, - visited); - result += accessor.substr(accessor.indexOf("{")); - } - - if (descriptor.set) { - result += offset + indent + "set " + name + " "; - accessor = source(descriptor.set, indent, _limit, indent + offset, - visited); - result += accessor.substr(accessor.indexOf("{")); - } - } - return result; - }).join(",\n"); - - if (isCompact) { - if (names.length > limit && limit > 0) { - result += ",\n" + offset + indent + "//..."; - } - } - else { - if (names.length) - result += ","; - - result += "\n" + offset + indent + '"__proto__": '; - result += source(Object.getPrototypeOf(value), indent, 0, - offset + indent); - } - - result += "\n" + offset + "}"; - } - } - else { - result += String(value); - } - return result; -} -exports.source = function (value, indentation, limit) { - return source(value, indentation, limit); -}; diff --git a/addon-sdk/source/lib/sdk/lang/weak-set.js b/addon-sdk/source/lib/sdk/lang/weak-set.js deleted file mode 100644 index 8972602a5..000000000 --- a/addon-sdk/source/lib/sdk/lang/weak-set.js +++ /dev/null @@ -1,75 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -module.metadata = { - "stability": "experimental" -}; - -"use strict"; - -const { Cu } = require("chrome"); - -function makeGetterFor(Type) { - let cache = new WeakMap(); - - return { - getFor(target) { - if (!cache.has(target)) - cache.set(target, new Type()); - - return cache.get(target); - }, - clearFor(target) { - return cache.delete(target) - } - } -} - -var {getFor: getLookupFor, clearFor: clearLookupFor} = makeGetterFor(WeakMap); -var {getFor: getRefsFor, clearFor: clearRefsFor} = makeGetterFor(Set); - -function add(target, value) { - if (has(target, value)) - return; - - getLookupFor(target).set(value, true); - getRefsFor(target).add(Cu.getWeakReference(value)); -} -exports.add = add; - -function remove(target, value) { - getLookupFor(target).delete(value); -} -exports.remove = remove; - -function has(target, value) { - return getLookupFor(target).has(value); -} -exports.has = has; - -function clear(target) { - clearLookupFor(target); - clearRefsFor(target); -} -exports.clear = clear; - -function iterator(target) { - let refs = getRefsFor(target); - - for (let ref of refs) { - let value = ref.get(); - - // If `value` is already gc'ed, it would be `null`. - // The `has` function is using a WeakMap as lookup table, so passing `null` - // would raise an exception because WeakMap accepts as value only non-null - // object. - // Plus, if `value` is already gc'ed, we do not have to take it in account - // during the iteration, and remove it from the references. - if (value !== null && has(target, value)) - yield value; - else - refs.delete(ref); - } -} -exports.iterator = iterator; |