You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					124 lines
				
				4.3 KiB
			
		
		
			
		
	
	
					124 lines
				
				4.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								var cr = Object.create;
							 | 
						||
| 
								 | 
							
								if (cr) {
							 | 
						||
| 
								 | 
							
								    var callerCache = cr(null);
							 | 
						||
| 
								 | 
							
								    var getterCache = cr(null);
							 | 
						||
| 
								 | 
							
								    callerCache[" size"] = getterCache[" size"] = 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function(Promise) {
							 | 
						||
| 
								 | 
							
								var util = require("./util");
							 | 
						||
| 
								 | 
							
								var canEvaluate = util.canEvaluate;
							 | 
						||
| 
								 | 
							
								var isIdentifier = util.isIdentifier;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var getMethodCaller;
							 | 
						||
| 
								 | 
							
								var getGetter;
							 | 
						||
| 
								 | 
							
								if (!false) {
							 | 
						||
| 
								 | 
							
								var makeMethodCaller = function (methodName) {
							 | 
						||
| 
								 | 
							
								    return new Function("ensureMethod", "                                    \n\
							 | 
						||
| 
								 | 
							
								        return function(obj) {                                               \n\
							 | 
						||
| 
								 | 
							
								            'use strict'                                                     \n\
							 | 
						||
| 
								 | 
							
								            var len = this.length;                                           \n\
							 | 
						||
| 
								 | 
							
								            ensureMethod(obj, 'methodName');                                 \n\
							 | 
						||
| 
								 | 
							
								            switch(len) {                                                    \n\
							 | 
						||
| 
								 | 
							
								                case 1: return obj.methodName(this[0]);                      \n\
							 | 
						||
| 
								 | 
							
								                case 2: return obj.methodName(this[0], this[1]);             \n\
							 | 
						||
| 
								 | 
							
								                case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
							 | 
						||
| 
								 | 
							
								                case 0: return obj.methodName();                             \n\
							 | 
						||
| 
								 | 
							
								                default:                                                     \n\
							 | 
						||
| 
								 | 
							
								                    return obj.methodName.apply(obj, this);                  \n\
							 | 
						||
| 
								 | 
							
								            }                                                                \n\
							 | 
						||
| 
								 | 
							
								        };                                                                   \n\
							 | 
						||
| 
								 | 
							
								        ".replace(/methodName/g, methodName))(ensureMethod);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var makeGetter = function (propertyName) {
							 | 
						||
| 
								 | 
							
								    return new Function("obj", "                                             \n\
							 | 
						||
| 
								 | 
							
								        'use strict';                                                        \n\
							 | 
						||
| 
								 | 
							
								        return obj.propertyName;                                             \n\
							 | 
						||
| 
								 | 
							
								        ".replace("propertyName", propertyName));
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var getCompiled = function(name, compiler, cache) {
							 | 
						||
| 
								 | 
							
								    var ret = cache[name];
							 | 
						||
| 
								 | 
							
								    if (typeof ret !== "function") {
							 | 
						||
| 
								 | 
							
								        if (!isIdentifier(name)) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        ret = compiler(name);
							 | 
						||
| 
								 | 
							
								        cache[name] = ret;
							 | 
						||
| 
								 | 
							
								        cache[" size"]++;
							 | 
						||
| 
								 | 
							
								        if (cache[" size"] > 512) {
							 | 
						||
| 
								 | 
							
								            var keys = Object.keys(cache);
							 | 
						||
| 
								 | 
							
								            for (var i = 0; i < 256; ++i) delete cache[keys[i]];
							 | 
						||
| 
								 | 
							
								            cache[" size"] = keys.length - 256;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								getMethodCaller = function(name) {
							 | 
						||
| 
								 | 
							
								    return getCompiled(name, makeMethodCaller, callerCache);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								getGetter = function(name) {
							 | 
						||
| 
								 | 
							
								    return getCompiled(name, makeGetter, getterCache);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function ensureMethod(obj, methodName) {
							 | 
						||
| 
								 | 
							
								    var fn;
							 | 
						||
| 
								 | 
							
								    if (obj != null) fn = obj[methodName];
							 | 
						||
| 
								 | 
							
								    if (typeof fn !== "function") {
							 | 
						||
| 
								 | 
							
								        var message = "Object " + util.classString(obj) + " has no method '" +
							 | 
						||
| 
								 | 
							
								            util.toString(methodName) + "'";
							 | 
						||
| 
								 | 
							
								        throw new Promise.TypeError(message);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return fn;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function caller(obj) {
							 | 
						||
| 
								 | 
							
								    var methodName = this.pop();
							 | 
						||
| 
								 | 
							
								    var fn = ensureMethod(obj, methodName);
							 | 
						||
| 
								 | 
							
								    return fn.apply(obj, this);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								Promise.prototype.call = function (methodName) {
							 | 
						||
| 
								 | 
							
								    var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
							 | 
						||
| 
								 | 
							
								    if (!false) {
							 | 
						||
| 
								 | 
							
								        if (canEvaluate) {
							 | 
						||
| 
								 | 
							
								            var maybeCaller = getMethodCaller(methodName);
							 | 
						||
| 
								 | 
							
								            if (maybeCaller !== null) {
							 | 
						||
| 
								 | 
							
								                return this._then(
							 | 
						||
| 
								 | 
							
								                    maybeCaller, undefined, undefined, args, undefined);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    args.push(methodName);
							 | 
						||
| 
								 | 
							
								    return this._then(caller, undefined, undefined, args, undefined);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function namedGetter(obj) {
							 | 
						||
| 
								 | 
							
								    return obj[this];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function indexedGetter(obj) {
							 | 
						||
| 
								 | 
							
								    var index = +this;
							 | 
						||
| 
								 | 
							
								    if (index < 0) index = Math.max(0, index + obj.length);
							 | 
						||
| 
								 | 
							
								    return obj[index];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								Promise.prototype.get = function (propertyName) {
							 | 
						||
| 
								 | 
							
								    var isIndex = (typeof propertyName === "number");
							 | 
						||
| 
								 | 
							
								    var getter;
							 | 
						||
| 
								 | 
							
								    if (!isIndex) {
							 | 
						||
| 
								 | 
							
								        if (canEvaluate) {
							 | 
						||
| 
								 | 
							
								            var maybeGetter = getGetter(propertyName);
							 | 
						||
| 
								 | 
							
								            getter = maybeGetter !== null ? maybeGetter : namedGetter;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            getter = namedGetter;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        getter = indexedGetter;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return this._then(getter, undefined, undefined, propertyName, undefined);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								};
							 |